簡単なクエリを実行して、テーブル内の最も古いレコードを取得したいとします。 (これにはcreation_date列があります)。注文を使用する代わりにクエリを最適化する
どうすれば「オーダーバイ」を使わなくてもそれを得ることができます。それは非常に大きなテーブルであり、 "n"レコードだけを取得するためにテーブル全体で順序を使用することはそれほど説得力がありません。
(テーブルのN < <サイズを想定)
簡単なクエリを実行して、テーブル内の最も古いレコードを取得したいとします。 (これにはcreation_date列があります)。注文を使用する代わりにクエリを最適化する
どうすれば「オーダーバイ」を使わなくてもそれを得ることができます。それは非常に大きなテーブルであり、 "n"レコードだけを取得するためにテーブル全体で順序を使用することはそれほど説得力がありません。
(テーブルのN < <サイズを想定)
パフォーマンスが懸念される場合は、おそらく早すぎて注文の使用を破棄しないでください。
このようなクエリは、適切なインデックスでサポートされているトップNクエリとして実装できます。データは既にソートされているため、テーブル全体をソートする必要がないためインデックス。
例:あなたはたくさんのデータのを持っている場合は、適切なインデックスのない
select *
from table
where A = ?
order by creation_date
limit 10;
はそれが遅くなります。しかし、あなたはそのようなインデックス作成した場合:
create index test on table (A, creation_date);
クエリは、ソートせずに、正しい順序で行をフェッチ開始することができ、そして限界に達したときに停止しますが。
レシピ:where欄をインデックスに、次にorderを欄に入れます。
where句がない場合は、単にorder byをインデックスに入れます。 by orderは、特にasc/descが混在している場合は、インデックス定義と一致する必要があります。
索引付けされた上位N問合せは、パフォーマンス・キングです。必ず使用してください。
さらに読み取るためのIいくつかのリンク(すべての鉱山):
How to use index efficienty in mysql query
http://blog.fatalmind.com/2010/07/30/analytic-top-n-queries/(オラクルの中心)
http://Use-The-Index-Luke.com/(まだトップNクエリーをカバーするが、それは2011年に来ていません) 。
あなたは、いくつかのデータをグループ化して、特定のレコードを選択するためのHaving
句場合はGroup By
を使用することができます。
私はこの概念を以前はテストしていませんでしたが、creation_dateカラムにインデックスを作成してみました。行を自動的にソートするのは昇順です。次に、選択クエリでは、Limitby 20のorderby creation_date descを使用して最初の20個のレコードを取得できます。データベースエンジンは、索引が既に作業のソートを完了していることを認識し、実際にソートする必要はありません。インデックスから最後の20レコードを読み込むだけです。
creation_date
にインデックスを作成し、order by creation_date asc|desc limit n
を使用してクエリを実行すると、応答は非常に速くなります(実際は高速にはできません)。 「最新のn」シナリオでは、desc
を使用する必要があります。
このクエリに制限を追加する場合は(たとえばwhere state='LIVE'
)、クエリが非常に遅くなる可能性があり、インデックス作成戦略を再検討する必要があります。