我有这样的桌子
name | personal_number ----------------------------------------- Jon | 222 Alex | 555 Jon | 222 Jimmy | 999
我需要得到每个名字,哪个personal_number在表中重复超过1,这是结果必须是:
Jon Jon
所以,变式1):
SELECT name FROM mytable WHERE personal_number IN ( SELECT personal_number FROM mytable GROUP BY personal_number HAVING COUNT(*) > 1 )
变式2):
SELECT personal_number FROM mytable GROUP BY personal_number HAVING COUNT(*) > 1 )
然后,使用PHP,检索的personal_numbers加入为字符串(soemthing像这样’222′,’222′)并运行其他查询
SELECT name FROM mytable WHERE personal_number IN( here joined string )
变体2的工作速度比变体1快10倍,这对我来说是惊喜,我认为一个查询会更快,但…
(在表中是500000行,列个人编号未编入索引)
那么你对这种情况的意思呢?为什么变体2比变体1快许多?
似乎这个文章
http://www.mysqlperformanceblog.com/2010/10/25/mysql-limitations-part-3-subqueries提到的子查询速度非常慢.
您应该尽量避免使用子查询并使用加入.