0

次のクエリがあります。

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

これは show create テーブルです。

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 行 エクストラ

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 に答える