Mar*_*łek 5 php mysql sql join left-join
今天我发现我正在工作的项目存在性能问题。我使用 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
Run Code Online (Sandbox Code Playgroud)
其中table执行了大约 100k 条记录,0,7s而
SELECT count(*) FROM table
Run Code Online (Sandbox Code Playgroud)
执行0,01s
所以性能损失是巨大的。问题是 - 是否可以在查询中添加任何内容以使查询执行得更快(告诉 MySQL 在没有 WHERE 条件时忽略 LEFT JOINS),第二个问题 - 为什么 MySQL 在这种情况下使用联接joins都是LEFT而没有在哪里?
这里的问题是我向查询添加了许多条件,因此有时会使用许多 WHERE(最多 20-30 个条件),并且对于某些条件必须使用连接。
目前我无法检查索引(它们很可能会导致问题),但我仍然惊讶于 MySQL 在这种情况下不会忽略连接。
作为一种解决方法,在这种情况下,当没有使用条件时,或者对于大约 10-15 个不需要连接的条件,我不会使用左连接进行计数,但对于其他情况,我应该map为需要的连接创建。
AS @Gordon Linoff 在答案中提到连接不会创建任何额外的行,如果没有连接的查询生成 10 行,如果使用这些连接,将返回完全相同的行。
这两个查询不等价。MySQL如何知道两个表中不存在重复值,这会导致行相乘?
其实是有办法的。如果连接键在第二个表中被声明为唯一,则数据库引擎可以知道连接是不必要的。我很确定 MySQL 没有实现这种优化,但可能有其他数据库引擎可以实现。
| 归档时间: |
|
| 查看次数: |
1094 次 |
| 最近记录: |