2012-03-29 4 views
1

実行するのに1分以上かかる次のクエリはどのようにして最適化できますか?そのゆっくりと私はそれを削除した場合、o.idのdescの注文のために遅い数ミリ秒を実行します。続きこのクエリを最適化するには、実行するには1分以上かかります


select o.*, per.email, p.name 
from order o 
inner join product p 
on o.product_id=p.id 
inner join person per 
on o.person_id=per.id 
order by o.id desc 
limit 100; 

は、すべてのテーブルはInnoDBテーブルであり、合流主キーと外部キーの上にある


1 SIMPLE p index PRIMARY FK2EFC6C1E5DE2FC 8 NULL 6886 Using index; Using temporary; Using filesort 
1 SIMPLE o ref FK67E9050121C383DB,FK67E90501FC44A17C FK67E90501FC44A17C 8 dev.p.id 58 
1 SIMPLE per eq_ref PRIMARY PRIMARY 8 dev.o.person_id 1 Using index 

を説明した結果です。 130万 製品::7000 注文70000

インデックスが各テーブルのレコード数

順に状態欄のメール列に

ある

それ以外
+1

を参照することができ、あなたは関係のために使用されている各属性にインデックスを追加しただけでなく –

+1

をあなたのテーブル構造を投稿してください? (person_id、id、product_id、..)? – blejzz

+0

これらのテーブルに存在するすべてのインデックスを投稿してください – MatBailie

答えて

1

プランナは、ほとんどの場合、結合前に注文テーブルから行を削除するためのヒントを使用していません。したがって、サーバーはすべての行に対して結合を実行してから、少数の結果を返す必要があります。

select o.* from 
(select * order order by id desc limit 100) o 
inner join product p 
on o.product_id=p.id 
inner join person per 
on o.person_id=per.id 
order by o.id desc limit 100; 

はEDIT:対応する行は、製品や人のテーブルに存在していることを保証する制約がある場合にのみ、これは動作します

はこれを試してみてください。

+0

これはおそらくプロセスのスピードアップにつながりますが、正確な結果は得られません。これらの100行のうちの1つを結合できなかった場合はどうなりますか?その後、100行でなく99行になります。 –

+0

あなたは正しいです。それについて考えなかった。ただし、テーブルの設定方法によっても異なります。これらの列に外部キー制約がある場合、問題は発生しません。 – Dojo

+0

これらのテーブルがすべて正しく接続されていると仮定すると、o。*だけがフェッチされるため、この結合はまったく必要ありません。 –

0

はい、私はあなたの質問を理解しています。この場合はまず、クエリを.sqlファイルに保存してください。 SQL Server Management Studioの[ツール]メニューの[データベースエンジンチューニングアドバイザ]というSQL Serverユーティリティを使用できます。

最初にopen sql serverを開いて、ツールにアクセスし、オプション "データベースエンジンチューニングアドバイザー"を選択します。 次に、以前に保存したファイルを選択します。 今使用しているデータベースとクエリで使用されているテーブルをチェックしてから メインメニューの[分析開始]をクリックします。 これはあなたのクエリにこの推薦を適用するために今 を作成する可能性のあるインデックスとstatesticsを示すアクションmanuに移動し、あなたのテーブル上のインデックスとstatesticsを作成し、クエリの実行時間を短縮する "Apply Recommendandation"を選択します。

+0

OPはMySQLを使用しています – Simon

関連する問題