sql >> データベース >  >> RDS >> Mysql

Column1 <=X<=Column2を満たす行を検索するSQLクエリは非常に遅い

    テーブル内のデータのプロパティに依存するソリューションを見つけました。現在のデータに依存しない、より一般的なソリューションが欲しいのですが、当面はそれが最善です。

    元のクエリの問題:

    SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;
    

    実行には、FirstXのエントリの大部分をスキャンする必要がある場合があるということです。 、LastXP 最初の条件が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倍以上速い



    1. Ruby on Rails:データベースからアイテムをプルして、指定された順序で返す方法はありますか?

    2. 実行する前に、影響を受けるsqlを更新する行数を知るにはどうすればよいですか?

    3. ODBCを使用してOracleDBに接続する

    4. mysqlでの初期認証の問題