3

次のクエリがあります。

SELECT * FROM table_1 
WHERE longitude > 5.71873540775 
  AND longitude < 6.30763059225 
  AND latitude > 52.1688986788 
  AND latitude < 52.5286273212 
LIMIT 0, 50 

このクエリの実行速度は非常に遅いです。経度と緯度について、複合インデックスと個別インデックスの両方を試しました。テーブルには多くの行 (200.000) と 10 列が含まれています。上記のクエリの結果数は 20 です。

この特定のクエリをより高速に実行するにはどうすればよいでしょうか?

更新 1

これは実行計画です:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  table_1     range   longitude,latitude  longitude   6   NULL    1401    Using where
4

1 に答える 1

0

ypercube が言うように、2 つの範囲クエリはうまく機能しません。しかし、何らかの理由でエンジンを myISAM に切り替えることができない場合があります。これを行うには、範囲検索を別々に行う 2 つのクエリに作業を分割します。

緯度フィールドに 1 つ、経度に 1 つ、別々のインデックスが必要です。

SELECT * FROM

(
SELECT * FROM table_1
WHERE longitude > 5.71873540775 
  AND longitude < 6.30763059225 
) a,
(
SELECT * FROM table_1
WHERE latitude > 52.1688986788 
  AND latitude < 52.5286273212 
) b

WHERE a.id = b.id

空間インデックスを使用するほど高速ではありませんが、現在の方法よりも少し高速になる可能性があります。

于 2012-10-25T17:57:47.163 に答える