我有以下查询:
SELECT * FROM `alltrackers`
WHERE `deviceid`='FT_99000083401624'
AND `locprovider`!='none'
ORDER BY `id` DESC
这是show create table:
CREATE TABLE `alltrackers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`deviceid` varchar(50) NOT NULL,
`gpsdatetime` int(11) NOT NULL,
`locprovider` varchar(30) NOT NULL,
PRIMARY KEY (`id`),
KEY `statename` (`statename`),
KEY `gpsdatetime` (`gpsdatetime`),
KEY `locprovider` (`locprovider`),
KEY `deviceid` (`deviceid`(18))
) ENGINE=MyISAM AUTO_INCREMENT=8665045 DEFAULT CHARSET=utf8;
我已删除了我认为对此问题不必要的列。
这是此查询的EXPLAIN输出:
id select_type表类型possible_keys键key_len ref rows Extra
1 SIMPLE alltrackers ref locprovider,deviceid deviceid 56 const 156416使用 哪里;使用filesort
此特定查询显示为在mytop(mtop)中花费几秒钟。我有点困惑,因为相同的查询但使用不同的“deviceid”并不需要那么长时间。虽然我只需要最后一行,但我已经删除了LIMIT 1,因为它需要更长的时间。该表目前包含300万行。
它用于存储来自不同GPS设备的位置。每个GPS设备都具有唯一的设备ID。位置进入并添加到表中。对于统计信息,我正在运行上述查询,以查找某个设备上次收到的位置的时间。
我愿意就进一步优化查询甚至表格的方法提出建议。
非常感谢提前。
答案 0 :(得分:0)
如果您只需要最后一行,请在(deviceid, id, locprovider)
上添加索引。 (deviceid, id, locprovider, gpsdatetime)
上的索引会更快:
ALTER TABLE alltrackers
ADD INDEX special_covering_IDX
(deviceid, id, locprovider, gpsdatetime) ;
然后尝试一下:
SELECT id, locprovider, gpsdatetime
FROM alltrackers
WHERE deviceid = 'FT_99000083401624'
AND locprovider <> 'none'
ORDER BY id DESC
LIMIT 1 ;