5

嗨,我有下表 T:

id    1   2    3    4
col   a   b    a    c

我想做一个选择,当 group by(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);

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

问题是 where in 语句似乎非常慢。在我的真实案例中,内部选择的结果有很多'col',大约 70000 并且需要几个小时。

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

我可以用 where in 代替 join 或更快的东西吗?

谢谢

4

2 回答 2

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
于 2010-03-19T13:25:13.160 回答
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)确保您在(in InnoDB) 或(col, id)(in MyISAM)上有一个索引

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

于 2010-03-19T13:34:29.057 回答