如何减少MySQL O(n ^ 2)查询的时间?

时间:2011-10-21 20:25:39

标签: mysql facebook

尝试运行此查询以查找两个集合的交集(在一个页面上发布的用户和在另一个页面上发布的用户)。不幸的是,这需要花费大量的时间才能完成(10分钟以上)。有没有办法降低其复杂性?

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 )

3 个答案:

答案 0 :(得分:4)

在MySQL中有一个bug,其中带有子查询的IN有时会提供非常差的性能(在MySQL 5.6中已修复)。

使用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

答案 1 :(得分:0)

如果您对数据库模式的外观有所了解会有所帮助,但如果这需要10多分钟,我会猜测问题是您在page_id列上没有索引。尝试添加索引并重新运行该查询。

答案 2 :(得分:0)

如果未对user_id编制索引,则使用DISTINCT属性会导致查询对结果进行排序,这将具有类似O(N ^ 2)的性能。真的需要DISTINCT吗?