组合的SQL查询花费了太多时间

时间:2017-08-23 06:48:13

标签: mysql sql

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秒。 为什么这需要太多时间。 我也写了一个不同的相同类型的查询,但所有这些都没有花费那么多时间。

3 个答案:

答案 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_iduser_bookmarks.user_id, user_bookmarks.post_id

上有适当的索引

答案 1 :(得分:2)

我的方法:

您需要为字段post_feeds创建索引。post_iduser_bookmarkspost_iduser_bookmarksuser_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)

如果是这样,那么我们就会知道性能缓慢的来源。