MySQL中的一个查询在执行时花费了太多时间。在这个查询中,我使用IN运算符从MySQL数据库中获取数据库。
我的查询:
SELECT *
FROM databse_posts.post_feeds
WHERE
post_id IN (SELECT post_id FROM database_users.user_bookmarks where user_id=3) AND
post_date < unix_timestamp();
在这种情况下,两个单独的查询执行时间非常短,如
SELECT post_id FROM database_users.user_bookmarks where user_id=3
最多需要400毫秒
和
SELECT * FROM databse_posts.post_feeds Where post_date < unix_timestamp();
最多需要300毫秒
但是使用IN运算符将两个查询组合在一起需要大约6到7秒。 为什么这需要太多时间。 我也写了一个不同的相同类型的查询,但所有这些都没有花费那么多时间。
答案 0 :(得分:2)
而不是IN(subselect)你可以在子选择
上尝试内连接SELECT *
FROM databse_posts.post_feeds
INNER JOIN (
SELECT post_id
FROM database_users.user_bookmarks
where user_id=3
) T on T.post_id = post_feeds.post_id
AND
post_date < unix_timestamp();
并确保您在post_feeds.post_id
和user_bookmarks.user_id, user_bookmarks.post_id
答案 1 :(得分:2)
我的方法:
您需要为字段post_feeds
创建索引。post_id
,user_bookmarks
。post_id
,user_bookmarks
。user_id
和{{1然后使用INNER JOIN让MySQL引擎以有效的方式操作过滤和合并行:
post_feeds
答案 2 :(得分:1)
我粗略猜测的是WHERE IN
表达式正在做一些您可能不知道的事情。考虑您的完整查询:
SELECT *
FROM databse_posts.post_feeds
WHERE
post_id IN (SELECT post_id FROM database_users.user_bookmarks where user_id=3) AND
post_date < unix_timestamp();
MySQL必须为每条记录检查post_id
的每个值,并将其与来自子查询的post_id
列表进行比较。这比仅运行一次子查询要昂贵得多。 MySQL可以使用各种技巧来加快速度,但WHERE IN
子句中的子查询与仅运行该子查询一次不同。
如果这个假设是正确的,那么以下查询也应该在6-7秒的范围内:
SELECT *
FROM databse_posts.post_feeds
WHERE
post_id IN (SELECT post_id FROM database_users.user_bookmarks where user_id=3)
如果是这样,那么我们就会知道性能缓慢的来源。