我正在使用mysql,这样的简单查询似乎永远与cpu 100%挂起。
select login_name, server, recharge
from role_info
where login_name in (select login_name
from role_info
group by login_name
having count(login_name) > 1)
表role_info很小,只有33535行。
下面是解释的输出:
| id | select_type |表|类型| possible_keys |关键| key_len | ref |行|额外|
| 1 |主要| role_info |所有| NULL | NULL | NULL | NULL | 33535 |使用where |
| 2 |相关的子信息| role_info |指数| NULL | a | 302 | NULL | 1 |使用索引|
show processlist报告查询保持发送数据。
查询| 1135 |发送数据|选择login_name,server,从role_info中重新登录login_name in(从...中选择login_name
我可以切换到加入而不是“in”,它可以正常工作。但仍然好奇为什么这个简单的查询应该如此异常。
答案 0 :(得分:1)
我想知道有多少人一次又一次地绊倒这个虫子。它是持久的MySQL bug#32665,其中MySQL 6是目标版本。这意味着MySQL会将不相关的子查询转换为相关的(每行外部结果集执行)。以防万一,在this blog帖子中有一些想法可以解决限制,当您无法将查询重写为使用JOIN
时。
答案 1 :(得分:0)
在MySQL的某些版本中,带有子查询的in
效率非常低。对每个正在处理的行执行子查询。换句话说,结果不会被缓存。我认为这是在最新版本中修复的。
您知道如何使用join
来修复它。一般来说,我倾向于使用MySQL中的join
或exists
,而不是使用带有子查询的in
。