尝试运行此查询以查找两个集合的交集(在一个页面上发布的用户和在另一个页面上发布的用户)。不幸的是,这需要花费大量的时间才能完成(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 )
答案 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
吗?