今天我发现我正在处理的项目存在性能问题。我使用的是 Laravel 框架,因此大多数查询都不是手动生成的。
问题:
SELECT count(*) FROM table LEFT JOIN a ON table.a_id= a.id LEFT JOIN b ON table.b_id = b.id LEFT JOIN c ON table.c_id = c.id
其中 table
有大约 100k 条记录执行 0,7s
而
SELECT count(*) FROM table
执行 0,01s
所以性能损失很大。问题是 - 是否可以向查询添加任何内容以使查询执行得更快(告诉 MySQL 在没有 WHERE 条件时忽略 LEFT JOINS )和第二个问题 - 为什么 MySQL 在这种情况下完全使用连接加入是 LEFT 并且没有在哪里?
这里的问题是我在查询中添加了很多条件,所以有时会使用很多 WHERE(最多 20-30 个条件)并且对于某些条件必须使用连接。
目前我无法检查索引(它们很可能会导致问题)但我仍然很惊讶 MySQL 在这种情况下不会忽略连接。
作为一种解决方法,在这种情况下,当没有使用任何条件时,或者对于大约 10-15 个不需要连接的条件,我不会使用左连接进行计数,但对于其他情况,我应该创建 map
需要的连接。
AS @Gordon Linoff 在答案中提到连接不会创建任何额外的行,如果没有连接的查询生成 10 行,如果使用这些连接,将返回完全相同的行。
最佳答案
这两个查询不等价。 MySQL 如何知道两个表中没有重复值,这将导致行相乘?
其实是有办法的。如果连接键在第二个表中被声明为唯一的,那么数据库引擎就可以知道连接是不必要的。我很确定 MySQL 不会实现这种优化,但可能有其他数据库引擎会实现。
关于php - MySQL - 计算左连接没有性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29240382/