mysql - 此查询或我的数据库有什么问题?糟糕的表现

标签 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 分钟内完成此操作,但是随着表的增大,性能呈指数级下降。远程它会失去与服务器的连接,而在本地它会使我的系统瘫痪并且似乎永远持续下去。

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

编辑,回答 Rob 的请求:

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

最佳答案

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

关于mysql - 此查询或我的数据库有什么问题?糟糕的表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2870626/

相关文章:

mysql - 使用 REGEX 从 MySQL 中的 URL 中提取主机名

php - 如何记录 Silverstripe 的页面生成时间和 MySQL 查询次数

MySQL 查询失败

mysql - 计算两个表中行 id 不匹配的 (*) 行。

mysql - LEFT JOIN 条件中键的顺序

mysql - Flask + MySQL + PHP + Docker-Compose = 痛苦

php - 如何防止mysql错误显示表?

python - 如何提高 OpenCV cv2.VideoCapture(0).read() 的性能

javascript - 如何简化/精简这段代码? (对象检查到函数调用中)

performance - 具有许多单元的 Delphi 项目需要大量运行