インデックスは必ずしもパフォーマンスを向上させるわけではありません。何が起こっているのかをよりよく理解するには、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
を使用します 最後を使用します。