2014-10-09 118 views
0

以下是我的表:在我的數據庫gps_gotaxikingMySQL表和查詢優化

+-----------+---------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-----------+---------------------+------+-----+---------+----------------+ 
| RecordID | bigint(20) unsigned | NO | PRI | NULL | auto_increment | 
| CarNo  | varchar(10)   | NO | MUL | NULL |    | 
| Valid  | varchar(48)   | NO |  | NULL |    | 
| lon  | varchar(13)   | NO |  | NULL |    | 
| lat  | varchar(13)   | NO |  | NULL |    | 
| angle  | varchar(10)   | NO |  | NULL |    | 
| speed  | varchar(10)   | NO |  | NULL |    | 
| CarStatus | varchar(10)   | NO |  | NULL |    | 
| Time  | datetime   | NO |  | NULL |    | 
+-----------+---------------------+------+-----+---------+----------------+ 

目前近100萬行數據。
我查詢使用下面的代碼:

SELECT lat, lon 
FROM gps_gotaxiking 
WHERE `CarNo` = "XXXX" 
AND Time BETWEEN 'yyyy-mm-dd 00:00:00' AND 'yyyy-mm-dd 23:59:59' 
AND Valid = 'Normal'; 

我可以得到的結果,但它的返回時間超過1分鐘, 有沒有什麼辦法來簡化查詢,並減少處理時間?

+0

爲什麼你使用幾乎相當的時間varchar數據類型? – 2014-10-09 12:29:07

+0

有多少行匹配'CarNo =「XXXX」'? – Barmar 2014-10-09 12:31:55

+0

如何爲CarNo添加索引? – mreiterer 2014-10-09 12:34:24

回答

0

把密鑰放在列ValidTime。考慮使用整數列Valid!訪問時間應該低於一秒。

+0

可以在(CarNo,Valid,Time)上添加複合索引嗎? – unk 2014-10-09 12:47:47

+0

我通常會在每列上做單個鍵......但這需要更多關於數據的知識。 – Chris 2014-10-09 12:50:08

0

添加上(CarNo, Time)一個綜合指數,以優化這個查詢:

CREATE INDEX car_time on gps_gotaxiking (CarNo, Time); 
+0

'有效'不一起添加到組合索引? – unk 2014-10-09 12:45:50

+0

如果前兩列有足夠的辨別力,那可能是矯枉過正的。 – Barmar 2014-10-09 12:48:00