GPS跟踪系统的MySQL查询优化

时间:2012-12-08 14:02:57

标签: mysql optimization

我有以下查询:

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。位置进入并添加到表中。对于统计信息,我正在运行上述查询,以查找某个设备上次收到的位置的时间。

我愿意就进一步优化查询甚至表格的方法提出建议。

非常感谢提前。

1 个答案:

答案 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 ;