我尝试执行以下查询以查找在特定列中具有5个具有相同值的行的行:
SELECT * FROM `tbl` WHERE columnName IN (
SELECT columnName FROM `tbl` GROUP BY columnName HAVING COUNT(*) > 5
)
查询似乎需要永远,我需要手动杀死它。但是,子查询本身非常快。我想要整行的原因是因为我打算删除这些行。我知道子查询有时会变得非常慢,并且最好避免它们。
如何在不使用子查询的情况下编写相同的内容?
答案 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秒以上的时间运行子查询。