テーブル内のデータのプロパティに依存するソリューションを見つけました。現在のデータに依存しない、より一般的なソリューションが欲しいのですが、当面はそれが最善です。
元のクエリの問題:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;
実行には、FirstX
のエントリの大部分をスキャンする必要がある場合があるということです。 、LastX
、P
最初の条件がFirstX <= ?
の場合のインデックス 行の大部分が満足しています。
実行時間を短縮するために私がしたことは、LastX-FirstX
を観察することです。 比較的小さいです。
クエリを実行しました:
SELECT MAX(LastX-FirstX) FROM SomeTable;
4200000
を取得しました 。
これは、FirstX >= LastX – 4200000
を意味します テーブル内のすべての行に対して。
したがって、LastX >= ?
を満たすために 、FirstX >= ? – 4200000
。
したがって、次のようにクエリに条件を追加できます。
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;
質問でテストした例では、処理されるインデックスエントリの数が2104820
から減少しました。 18
へ 実行時間が0.563秒から短縮されました 〜0.0003秒 。
同じ120000
で新しいクエリをテストしました X
の値 。出力は古いクエリと同じでした。 10時間以上から時間が短縮されました 〜5.5分 、100倍以上速い 。