【问题标题】:Mysql IN operator taking long time to executeMysql IN 运算符执行时间长
【发布时间】:2014-02-25 09:48:38
【问题描述】:

我有以下表格:

Table 1 : Contacts
Fields : id  first_name

Values : 

1    Reeta
2    Rohan
3    John 

Table 2 : email (it contains contact_id of contacts table)
Fields : id   contact_id  email_address

Values :

1  1  r@gmail.com
2  2  r@gmail.com
3  3  j@gmail.com

I want to display all duplicates by email. Like this:

cont_id  first_name  email_address

   1        Reeta  r@gmail.com
   2        Rohan  r@gmail.com

这是我的查询:

select contact_id 
from contacts 
where email_address IN (
  SELECT S.email_address 
  FROM  contacts R
  INNER JOIN email
    ON R.id = S.contact_id 
  Group By email_address
  Having Count(S.id) > 1
); 

查询需要很长时间才能执行大量记录。然而,内部查询工作得更快,但外部查询却不行。请帮忙。

【问题讨论】:

  • 可能不是IN但嵌套查询有问题,试试join-query
  • 对于嵌套查询中调用的每一行加入
  • 您需要消除子查询,它在外部查询的每次迭代中运行。将EXPLAIN 添加到此查询中以获取有关 mysql 如何执行它的详细信息。
  • 尝试使用这种方式:Select all duplicate rows based on one or two columns? 我想你想要类似的东西。
  • 解释您的查询并添加表结构

标签: mysql mysql-slow-query-log


【解决方案1】:

是的,这是 MySQL 查询优化器的问题。问题是 - MySQL 的 IN (subquery)= ANY () subquery 相同。即使子查询返回很少的值计数,MySQL 也不会对此进行优化,这些值在正常情况下很容易通过索引进行比较(如果它存在于我们正在执行的列上IN)。

不要将其与 IN (<static values list>) 混淆 - 这是完全不同的情况,当 MySQL 将 IN 不作为特定类型的子查询,而是作为比较运算符 - 因此,使用索引.

因此,一种可能的解决方案是 - 分离您的子查询,以便它返回一些值列表,然后将该列表替换为 IN (),因为将 IN 视为比较运算符而进行索引扫描。但是,在某些情况下,可以通过将子查询替换为JOIN 来获得解决方案。并非在所有情况下都是可能的,因此上述解决方案将适用于常见的非平凡情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多