我有一個MySQL查詢有時需要1秒鐘才能執行。查詢如下:如何使此MySQL查詢更快?
SELECT `id`,`totaldistance` FROM `alltrackers` WHERE `deviceid`='FT_99000083426364' AND (`gpsdatetime` BETWEEN 1341100800 AND 1342483200) ORDER BY `id` DESC LIMIT 1
該查詢運行在一個循環中,以檢索月份某些日子的行等。這將導致頁面接管25秒有時加載...
表結構如下:
CREATE TABLE IF NOT EXISTS `alltrackers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`deviceid` varchar(50) NOT NULL,
`lat` double NOT NULL,
`long` double NOT NULL,
`gpsdatetime` int(11) NOT NULL,
`version` int(11) DEFAULT NULL,
`totaldistance` int(11) NOT NULL DEFAULT '0',
`distanceprocessed` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `id_deviceid` (`id`,`deviceid`),
UNIQUE KEY `deviceid_id` (`deviceid`,`id`),
KEY `deviceid` (`deviceid`),
KEY `deviceid_gpsdatetime` (`deviceid`,`gpsdatetime`),
KEY `gpsdatetime_deviceid` (`gpsdatetime`,`deviceid`),
KEY `gpsdatetime` (`gpsdatetime`),
KEY `id_deviceid_gpsdatetime` (`id`,`deviceid`,`gpsdatetime`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=677242 ;
我已經加入各項指標的組合(請告訴我哪刪除)在爲了試圖讓MySQL使用索引進行查詢,但無濟於事。
這裏是EXPLAIN輸出:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE alltrackers index deviceid_id,deviceid,deviceid_gpsdatetime,gpsdatet... PRIMARY 4 NULL 677238 Using where
我使用ORDER BY ASC/DESC LIMIT 1的原因是因爲我需要查詢的第一行和最後一行。運行沒有LIMIT 1的查詢並使用PHP檢索第一行和最後一行會更快嗎?
非常感謝您的幫助!
重複索引不起作用。您可以要求MySQL [使用特定索引](http://dev.mysql.com/doc/refman/5.5/en/index-hints.html)。你可以嘗試一個想法:爲時間段創建一個(臨時?)表,加入那個表而不是硬編碼範圍,'SELECT device_id,MAX(id)WHERE