MySQL避免使用子查询来查找列中具有相同值的所有行

时间:2014-06-11 08:01:09

标签: mysql subquery

我尝试执行以下查询以查找在特定列中具有5个具有相同值的行的行:

SELECT * FROM `tbl` WHERE columnName IN (
   SELECT columnName FROM `tbl` GROUP BY columnName HAVING COUNT(*) > 5
)

查询似乎需要永远,我需要手动杀死它。但是,子查询本身非常快。我想要整行的原因是因为我打算删除这些行。我知道子查询有时会变得非常慢,并且最好避免它们。

如何在不使用子查询的情况下编写相同的内容?

1 个答案:

答案 0 :(得分:2)

您可以使用临时表作为快速执行的方法:

-- creating indexed temporary results

DROP TEMPORARY TABLE IF EXISTS `tmp_tbl`;

CREATE TEMPORARY TABLE `tmp_tbl`
   SELECT columnName FROM `tbl` GROUP BY columnName HAVING COUNT(*) > 5;

CREATE INDEX icolname ON  `tmp_tbl`(columnName);

-- now selecting your data
SELECT `tbl`.* 
FROM `tbl` INNER JOIN `tmp_tbl` on `tbl`.columnName = `tmp_tbl`.columnName;

-- to delete your data
DELETE FROM `tbl` 
INNER JOIN `tmp_tbl` on `tbl`.columnName = `tmp_tbl`.columnName;

我在一张包含100000多条记录的表格中进行了测试,它在2-4秒内以50秒以上的时间运行子查询。