私は地理空間データと座標を持つ名前をSQLiteテーブルに持っており、その場所のrtreeと名前カラムの通常のインデックスを作成しました。rtreeと通常のインデックススローを使用したSQLiteクエリ
RTREEは、このドキュメントに応じて使用されている:私は特定のエリア内のレコードを照会すると http://www.sqlite.org/rtree.html
、RTREEが使用され、それが高速で動作します:
SELECT demo_data.* FROM demo_data, demo_index
WHERE demo_data.id=demo_index.id
AND minX>=-81.0 AND maxX<=-79.6
AND minY>=35.0 AND maxY>=36.2;
私は名前だけのために照会すると、
SELECT demo_data.* FROM demo_data
WHERE objname="Test"
をしかし、私はその非常に遅い2を組み合わせると、テーブル全体のように思える:それはまた、名前、インデックスが使用されているため、高速で行きますスキャンされます:
SELECT demo_data.* FROM demo_data, demo_index
WHERE demo_data.id=demo_index.id
AND objname="Test"
AND minX>=-81.0 AND maxX<=-79.6
AND minY>=35.0 AND maxY>=36.2;
2つのインデックスを使用するこの組み合わせのクエリはなぜ遅いですか?
更新:クエリプランをEXPLAINでより多くの調査の後、それはインデックスが実際に個々の条件によって使用されていること、判明
。しかし、複合クエリの実行時間は、最初の条件のレコード数に依存します。この表demo_dataには10mioのレコードがあります。最初の条件が大量のレコードを返す場合、組み合わせは遅くなります。この場合、objname = "Test"の1000レコードがあり、組み合わせたクエリは4秒かかります。一度しか存在しないobjname = "Test12345"の組み合わせクエリは非常に速く、わずか10msです
感謝EXPLAIN QUERY PLANについて言及する。これは、インデックスが実際に使用されていることを示しています。遅い実行の理由はデータの量です。質問を更新しました – Tom