这个查询或我的数据库出了什么问题?表现糟糕

时间:2010-05-20 02:14:41

标签: mysql performance join

SELECT * from `employees` a 
LEFT JOIN (SELECT phone1 p1, count(*) c, FROM `employees` GROUP BY phone1) b
ON a.phone1 = b.p1;

我不确定这个查询是否特别存在问题。我对这个数据库的表现一直很糟糕。该表有120,000行。我已经使用MyISAM和InnoDB引擎远程和本地尝试了这个特定的查询,具有不同类型的连接,并且在phone1上有和没有索引。我可以在10,000行表上成功地在大约4分钟内完成此操作,但性能随着较大的表呈指数下降。远程它将失去与服务器的连接,并在本地它使我的系统瘫痪,似乎永远继续。

此查询只是我在较大查询无法完成时尝试执行的较小步骤。也许我应该解释整个场景。我有一个很大的丑陋的桌子,列出了一堆人和他们的联系信息以及他们工作的公司的信息。我正在尝试规范化数据库并智能地确定哪些电话号码适用于个人以及适用于办公地点的电话号码。我的理由是,如果电话号码多次出现且出现的次数等于它所附着的街道地址的次数,那么它必须是办公室号码。因此,第一步是按电话号码计算每个电话号码的分组数。通常,如果您只使用COUNT()... GROUP BY,它将仅列出它在该组中找到的第一条记录,因此我想我必须将整个表连接到电话号码匹配的计数表。这确实有效,但正如我所说,我无法在任何大于10,000行的表上成功完成它。这看起来很可悲,这似乎不是一个疯狂的查询。是否有更好的方法来实现我想要的或者我必须将我的大表分成12个或者表或db有什么问题?

编辑,回答Rob的要求:

1, 'PRIMARY', 'a', 'ALL', '', '', '', '', 60097, ''
1, 'PRIMARY', '', 'ALL', '', '', '', '', 9363, ''
2, 'DERIVED', 'employees1', 'ALL', '', '', '', '', 60097, 'Using temporary; Using filesort'

1 个答案:

答案 0 :(得分:1)

如果这是一次性标准化“清理”,我会将你的子查询推送到一个临时表,索引,你是否加入它,然后在你完成后删除它。