1

私は鳥種の目撃情報を記録するテーブル foo を持っています。foo_id はその PK で、その他の関係する列は s_date、緯度、経度です。species_id はその FK です。s_date、緯度と経度、species_id にインデックスがあります。テーブル foo には 2,000 万件のレコードがあり、増加しています。次のクエリは、特定の緯度/経度における最新の種の目撃情報上位 10 件を表示します。クエリに時間がかかりすぎています (10 分以上かかることもあります)。それを最適化する方法は?私はmysqlを使用しています。

SELECT species_id, max(s_date) 
FROM foo 
WHERE latitude >= minlat 
    AND latitude <= maxlat 
    AND longitude >= minlon 
    AND longitude <= max lon 
GROUP BY species_id 
ORDER BY MAX(s_date) DESC LIMIT 0, 10;
4

1 に答える 1

0

あなたが言及したフィールドに個別のインデックスがあることを理解しています。次の場所に複合インデックス (別名、複数列インデックス) を追加してみてください(latitude, longitude)

CREATE INDEX ix_foo_lat_lng ON foo (latitude, longitude);

クエリでを実行しEXPLAINて、MySQL が使用しているインデックスを確認することができます。MySQL マニュアルからの引用:: How MySQL Use Indexes :

次のSELECTステートメントを発行するとします。

mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

複数列インデックスがcol1およびに存在する場合col2、適切な行を直接フェッチできます。と に個別の単一列インデックスが存在する場合col1col2オプティマイザーはインデックス マージ最適化の使用を試みるか、どのインデックスがより少ない行を検出するかを決定し、そのインデックスを使用して行をフェッチすることにより、最も制限の厳しいインデックスを見つけようとします。

次のプレゼンテーションもご覧ください。

著者は、MySQL でHaversine Formulaを使用して近接度で並べ替え、定義された範囲に検索を制限する方法について説明しています。彼はまた、緯度と経度の列に従来のインデックスを使用して、そのようなクエリの完全なテーブル スキャンを回避する方法についても説明しています。


1 PDF版

于 2010-09-23T19:13:13.780 に答える