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

2点間の距離を計算する関数でOrderByを使用すると、MySQLクエリが遅くなります(long、lat)

    オプション:

    1. 保存されたproceduredefinition/logic内にソートを組み込みます。ストアドプロシージャ内でSQLselectを呼び出す場合は、そこで並べ替えと制限を実行します 。 -これは、ストアドプロシージャで10,000行を生成するのではなく、それらを再利用することを意味します。また、テーブルにインデックスがある場合、SQLselect内の元の並べ替えははるかに高速になる可能性があります。

    2. テーブル内でインデックスが使用されていることを確認します。 -インデックスを使用すると、テーブルで選択するときに並べ替えがより迅速に実行されます。

    関数の定義を教えてください。追加のサポートが簡単になります。

    最後に、後で行うのではなく、注文を移動して関数内で直接制限するようにしてください。関数は、直接ソートされて準備ができた10個の結果を返すことができます。必要に応じて、2つの関数を作成します。1つは完全な結果を返し、もう1つは限定されてソートされた結果を返します。

    更新:

    関数を見た後、計算値で並べ替えようとしていることが明らかになります。計算値による順序付けは、以下にも記載されているように非常に遅いです:

    結果の最終的な順序付けを高速化するために、col1またはcol2に基づいてデータを「前処理/順序付け」する方法を考えています。 col1とcol2がテーブルの列であり、funResultがグラフ化できる数学関数である場合、2つのうちの1つは、関数の戻り値により大きな影響を及ぼします。...

    最後に、col1とcol2がmyTableの列である場合、ストアド関数を使用する必要はありませんが、クエリを実行できますが、大きな違いはありません...主な問題は、計算された関数による順序付けです:

    >
    SELECT rowId, ((col1-INPUT_CONST)*2)+(col2*3) AS funResult
    FROM myTable
    ORDER BY funResult DESC
    LIMIT 10
    

    更新2:

    計算された距離を並べ替える問題を掘り下げた後、私はこれが以下のリンクで非常に効率的に質問され解決されていることを発見しました。計算値による並べ替えに関しては、計算値による並べ替えは本質的に遅いです。追加のヘルプについては、次の2つのリンクを参照してください。

    最後に、あなたの答えに最も近いのはこれです: https://stackoverflow.com/a/4180065/1688441



    1. MySQLコールバック-そのようなことはありますか?

    2. Laravelでmysqlに接続する方法は?

    3. クエリのようにKnexで%をエスケープするにはどうすればよいですか?

    4. MySQLで整数シーケンスを生成する