0

我有以下查询:

SELECT * FROM `alltrackers`
WHERE `deviceid`='FT_99000083401624'
AND `locprovider`!='none'
ORDER BY `id` DESC

这是显示创建表:

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 table type possible_keys key key_len ref rows Extra

1 SIMPLE alltrackers ref locprovider,deviceid deviceid 56 const 156416 使用where;使用文件排序

此特定查询在 mytop (mtop) 中显示为需要几秒钟。不过,我有点困惑,因为相同的查询但具有不同的“deviceid”并不需要很长时间。虽然我只需要最后一行,但我已经删除了 LIMIT 1,因为这样会花费更长的时间。该表当前包含 300 万行。

它用于存储来自不同 GPS 设备的位置。每个 GPS 设备都有一个唯一的设备 ID。位置进来并被添加到表中。对于统计信息,我正在运行上述查询以查找从某个设备上次接收到位置的时间。

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

提前谢谢了。

4

1 回答 1

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 ; 
于 2012-12-08T14:23:08.080 回答