2011-01-05 6 views
1

簡単なクエリを実行して、テーブル内の最も古いレコードを取得したいとします。 (これにはcreation_date列があります)。注文を使用する代わりにクエリを最適化する

どうすれば「オーダーバイ」を使わなくてもそれを得ることができます。それは非常に大きなテーブルであり、 "n"レコードだけを取得するためにテーブル全体で順序を使用することはそれほど説得力がありません。

(テーブルのN < <サイズを想定)

答えて

3

パフォーマンスが懸念される場合は、おそらく早すぎて注文の使用を破棄しないでください。

このようなクエリは、適切なインデックスでサポートされているトップ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年に来ていません) 。

0

あなたは、いくつかのデータをグループ化して、特定のレコードを選択するためのHaving句場合はGroup Byを使用することができます。

2

私はこの概念を以前はテストしていませんでしたが、creation_dateカラムにインデックスを作成してみました。行を自動的にソートするのは昇順です。次に、選択クエリでは、Limitby 20のorderby creation_date descを使用して最初の20個のレコードを取得できます。データベースエンジンは、索引が既に作業のソートを完了していることを認識し、実際にソートする必要はありません。インデックスから最後の20レコードを読み込むだけです。

1

creation_dateにインデックスを作成し、order by creation_date asc|desc limit nを使用してクエリを実行すると、応答は非常に速くなります(実際は高速にはできません)。 「最新のn」シナリオでは、descを使用する必要があります。

このクエリに制限を追加する場合は(たとえばwhere state='LIVE')、クエリが非常に遅くなる可能性があり、インデックス作成戦略を再検討する必要があります。

関連する問題