2011-10-21 10 views
1

このクエリを実行して、2つのセット(あるページに投稿するユーザーと別のページに投稿するユーザー)の共通部分を見つけようとしています。残念ながら、これは完了するのにばかげた時間がかかります(10分以上)。その複雑さを減らす方法はありますか?MySQL O(n^2)クエリの時間をどのように短縮できますか?

SELECT DISTINCT (user_id) 
FROM facebook_post_comments 
WHERE page_id = some_page_id 
AND user_id IN (SELECT DISTINCT(user_id) 
       FROM facebook_post_comments 
       WHERE page_id = some_other_page_id) 
+0

使用しているMySQLのバージョンは? 'select version();' –

+0

Hey Mark、私は5.5.14を実行しています。 –

答えて

4

サブクエリを持つINが時々(MySQLの5.6で修正された)非常に悪いパフォーマンスを与えるMySQLでbugがあります。

JOIN代わりに使用して、この文字列で検索してください:あなたは、データベースのスキーマがどのように見えるかのいくつかのアイデアを提供した場合

SELECT DISTINCT user_id 
FROM facebook_post_comments T1 
JOIN facebook_post_comments T2 
    ON T1.user_id = T2.user_id 
    AND T2.page_id = some_other_page_id 
WHERE T1.page_id = some_page_id 
+0

+1私はそれを肯定する前に、私は6秒前に肯定するつもりでした。 – Patrick87

+0

このクエリは実行に時間の10分の1を要し、それはpage_idがインデックスされていません。余分な時間があれば5.6へのアップグレードに目を向けるつもりです。ありがとう! –

+0

インデックスを追加することで、ほぼ確実に大きな改善が得られます。 –

0

はそれが参考になると思いますが、これは10+分を取っている場合、私は行きますよ問題を推測するには、page_id列にインデックスがないことです。インデックスを追加して、そのクエリを再実行してみてください。

0

がインデックスに登録されていない場合は、DISTINCT属性を使用するとクエリで結果が並べ替えられ、O(N^2)のようなパフォーマンスになります。 DISTINCTは本当に必要ですか?

+0

この特殊なケースでは、DISTINCTが必要です。私は、ユーザーがpage_id 1とpage_id 2に参加したことを定量化できるようにしたいだけで、必ずしも相互作用の数を数えていません。それは理にかなっていますか? –

関連する問題