mysql" in"条款很慢(似乎挂)

时间:2014-10-31 10:54:35

标签: mysql

我正在使用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”,它可以正常工作。但仍然好奇为什么这个简单的查询应该如此异常。

2 个答案:

答案 0 :(得分:1)

我想知道有多少人一次又一次地绊倒这个虫子。它是持久的MySQL bug#32665,其中MySQL 6是目标版本。这意味着MySQL会将不相关的子查询转换为相关的(每行外部结果集执行)。以防万一,在this blog帖子中有一些想法可以解决限制,当您无法将查询重写为使用JOIN时。

答案 1 :(得分:0)

在MySQL的某些版本中,带有子查询的in效率非常低。对每个正在处理的行执行子查询。换句话说,结果不会被缓存。我认为这是在最新版本中修复的。

您知道如何使用join来修复它。一般来说,我倾向于使用MySQL中的joinexists,而不是使用带有子查询的in