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

クエリでLIMITを使用するとMySQLが遅いのはなぜですか?

    インデックスは必ずしもパフォーマンスを向上させるわけではありません。何が起こっているのかをよりよく理解するには、explainを含めると役に立ちます。 さまざまなクエリに対して。

    私の推測では、id_stateにインデックスがあります。 またはid_state, id_mp whereを満たすために使用できます 句。その場合、order byのない最初のクエリ このインデックスを使用します。かなり速いはずです。インデックスがない場合でも、これにはordersのページを順番にスキャンする必要があります テーブル、それでもかなり高速になる可能性があります。

    次に、creation_dateにインデックスを追加すると 、MySQLは、order byの代わりにそのインデックスを使用することを決定します 。これには、インデックスの各行を読み取り、対応するデータページをフェッチして、whereを確認する必要があります。 条件を設定し、列を返します(一致する場合)。この読み取りは、「ページ」の順序ではなく、インデックスで指定されているため、非常に非効率的です。ランダム読み取りは非常に非効率的です。

    さらに悪いことに、limitがある場合でも 、まだ全体を読む必要があります 結果セット全体が必要なため、テーブル。 38レコードのソートを保存しましたが、非常に非効率的なクエリを作成しました。

    ちなみに、ordersの場合、この状況は大幅に悪化します テーブルが使用可能なメモリに収まりません。次に、「スラッシング」と呼ばれる状態が発生します。この状態では、新しいレコードごとに新しいI/O読み取りが生成される傾向があります。したがって、ページに100個のレコードがある場合、そのページを100回読み取る必要がある場合があります。

    orders(id_state, id_mp, creation_date)にインデックスを付けることで、これらすべてのクエリをより高速に実行できます。 。 where 句は最初の2列とorder byを使用します 最後を使用します。



    1. Javaデスクトップ-データベースアクセスをUIスレッドから分離する方法は?

    2. OracleAPEX-いくつかのリンクを含むルックアップテーブル

    3. MySQL DAYOFWEEK()-私の週は月曜日から始まります

    4. EclipseヘルプのPostgresJDBC接続