对于MySQL的'where col in(list)'的替代方案

dud*_*ein 5 mysql where

嗨,我有下表T:

id    1   2    3    4
col   a   b    a    c
Run Code Online (Sandbox Code Playgroud)

我想做一个select,当group(col)有count(col)> 1时返回id,col

一种方法是

SELECT id,col FROM T 
   WHERE col IN (SELECT col FROM T GROUP BY(col) HAVING COUNT(col)>1);
Run Code Online (Sandbox Code Playgroud)

实习生选择(从右侧)返回'a',主要的一个(左)将返回1,a和3,a

问题是where语句似乎非常慢.在我的实际情况中,内部选择的结果有很多'col',约70000,而且需要几个小时.

现在,进行内部选择和主要选择获得所有ID和upcs并在本地进行交叉要快得多.MySQL应该能够有效地处理这种查询.

我可以将其中的内容替换为联接或更快的内容吗?

谢谢

Lie*_*ers 5

你可以尝试使用INNER JOIN加快速度

  • 确保你有一个索引 col
  • 覆盖索引col, id可能会让您获得更好的表现

SQL语句

SELECT  T.id, T.col
FROM    T
        INNER JOIN (
          SELECT   col
          FROM     T
          GROUP BY col
          HAVING COUNT(*) > 1
        ) tcol ON tcol.col = T.col
Run Code Online (Sandbox Code Playgroud)