gpt4 book ai didi

mysql - 在 MySql 中的 WHERE 语句上使用 OR 导致执行缓慢

转载 作者:行者123 更新时间:2023-11-29 06:08:19 24 4
gpt4 key购买 nike

以下查询使 mysql 的执行时间比使用两个单独的查询并避免在 WHERE 语句上使用 OR 来执行相同查询的时间长近 7 倍。我更喜欢使用单个查询,因为我可以对所有内容进行排序和分组。

这是有问题的查询:

EXPLAIN SELECT  *
FROM `posts`
LEFT JOIN `teams_users`
ON (teams_users.team_id=posts.team_id
AND teams_users.user_id='7135')
WHERE (teams_users.status='1'
OR posts.user_id='7135');

结果:

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE posts ALL user_id NULL NULL NULL 169642
1 SIMPLE teams_users eq_ref PRIMARY PRIMARY 8 posts.team_id,const 1 Using where

现在,如果我改为执行以下两个查询,如上所述,总执行时间缩短了 7 倍:

EXPLAIN SELECT  *
FROM `posts`
LEFT JOIN `teams_users`
ON (teams_users.team_id=posts.team_id
AND teams_users.user_id='7135')
WHERE (teams_users.status='1');

结果:

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE teams_users ref PRIMARY,status status 1 const 5822 Using where
1 SIMPLE posts ref team_id team_id 5 teams_users.team_id 9 Using where

和:

EXPLAIN SELECT  *
FROM `posts`
LEFT JOIN `teams_users`
ON (teams_users.team_id=posts.team_id
AND teams_users.user_id='7135')
WHERE (posts.user_id='7135');

结果:

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE posts ref user_id user_id 4 const 142
1 SIMPLE teams_users eq_ref PRIMARY PRIMARY 8 posts.team_id,const 1

显然,这两个查询扫描的行数要低得多。为什么初始查询很慢?谢谢。

最佳答案

是的,OR 通常是性能 killer 。一个常见的解决方法是执行 UNION。对于您的示例:

SELECT  *
FROM `posts`
LEFT JOIN `teams_users`
ON (teams_users.team_id=posts.team_id
AND teams_users.user_id='7135')
WHERE (teams_users.status='1')
UNION DISTINCT
SELECT *
FROM `posts`
LEFT JOIN `teams_users`
ON (teams_users.team_id=posts.team_id
AND teams_users.user_id='7135')
WHERE (posts.user_id='7135');

如果您确定没有重复项,请更改为更快的 UNION ALL

如果您不打算寻找丢失的 team_users 行,请使用 JOIN 而不是 LEFT JOIN

如果您需要ORDER BY,请添加一些括号:

( SELECT ... )
UNION ...
( SELECT ... )
ORDER BY ...

否则,ORDER BY 将仅应用于第二个 SELECT。 (如果您还需要“分页”,请参阅 my blog。)

请注意,在某些情况下您可能还需要 LIMIT

关于mysql - 在 MySql 中的 WHERE 语句上使用 OR 导致执行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39973833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com