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

时间:2010-03-19 13:22:24

标签: mysql where

您好我有下表T:

id    1   2    3    4
col   a   b    a    c

我想做一个选择,返回id,col当group by(col)有count(col)> 1

这样做的一种方法是

SELECT id,col FROM T 
   WHERE col IN (SELECT col FROM T GROUP BY(col) HAVING COUNT(col)>1);

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

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

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

我可以用where替换联接或更快的东西吗?

由于

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

SELECT  id, col
FROM    t t1
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    t t2
        WHERE   t2.col = t1.col
                AND t2.id <> t1.id
        )

确保您在(col)InnoDB)或(col, id)MyISAM

中有索引

内部查询一旦找到第一个匹配值就会停止评估。使用索引,这将在单个索引搜索最多两次索引扫描后发生。