2017-11-11 13 views
1

私のクエリのようなものです:サブクエリが速く実行されても、サブクエリを使用するSQLクエリが遅いのはなぜですか?

SELECT *, 
(SELECT COUNT(*) FROM comments WHERE comments.thread = threads.id) AS comments 
FROM threads 
LIMIT 10 

comments.threadがインデックスされ、このようなクエリは速く走る:

SELECT COUNT(*) FROM comments WHERE comments.thread = 'someId' 

をしかし、私のクエリはめちゃめちゃ遅いです。それは私が定義した限界の10秒間を要し​​ます。どうして?このクエリの

+2

*あなたのクエリが何であるかを私たちに示す必要がある* ...「私のクエリは次のようなものである」*実際に*、ではないあなたが似ていると信じている何かのように。あなたは、あなたがここで提供したことが、あなたの質問の要点を伝えていることに本当に似ていると仮定しているかもしれませんが、必ずしもそうであるとは限りません。表示されたクエリは、実際には有効なSQLではありません。あなたの*クエリを表示します。必要に応じてテーブル名とカラム名を変更しますが、それ以外は何もしないでください。 –

+0

私は5.6.22のあなたの質問と、適切なインデックスを使って「何かのようなもの」を走らせました。それはうまく最適化されました( 'SHOW SESSION STATUS LIKE 'Handler%'; 'から導かれたように) –

答えて

1

SELECT t.*, 
     (SELECT COUNT(*) FROM comments c WHERE c.thread = t.id) AS comments 
FROM threads t 
LIMIT 10; 

あなたはcomments(thread)のインデックスをしたいです。あなたの他のクエリが速く実行されている場合、私はあなたがすでにそれを持っていると思います。

おそらくLIMITとサブクエリが奇妙に動作しています。このバージョンも遅いですか?

SELECT t.*, 
     (SELECT COUNT(*) FROM comments c WHERE c.thread = t.id) AS comments 
FROM (SELECT t.* 
     FROM threads t 
     LIMIT 10 
    ) t; 
+0

各行に10秒かかることがあります。問題はサブクエリでなければなりません。何らかの理由で、このクエリで使用すると速度が遅くなります。 @LuisSequeira。 –

+0

。 。スレッドごとにいくつのコメントがありますか? –

+0

変数、数千まで –

1

あなたの内のクエリは、がそう外側のクエリの各行ためを実行し、それは外側のクエリからの値を使用する意味、サブクエリをcorelatedあります。多分、MySQLはクエリを最適化するのにあまり良くありません。

これを試してみてください:

SELECT threads.*, count(comments.thread) AS comments 
FROM threads 
JOIN comments ON comments.thread = threads.id 
GROUP BY 1,2,3,4,5 -- one number here for each column of the threads table 
LIMIT 10 
+0

おそらく、あなたは 'JOIN'を意味しました。そうであっても、それは 'JOINing'によってデータの量を爆発させ、' GROUP BY'によってデータを壊すだけです。常に遅くなります。 (私が間違っている例を自由に与えてください) –

+0

@rickはい、参加してください。あなたは単にそれを実行し、実際にそれが速いかどうかを確かめる代わりに見ることができます。 – Bohemian

関連する問題