php - MySQL - 计算左连接没有性能

标签 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

其中 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/

相关文章:

android - SQLite 是本地数据库吗?

带有可选参数的php mysql函数

php - Silex 服务 - $app 参数或 "use ($app)"语句?

插入数据库时​​Python嵌套循环错误

SQL 2005 在分隔符上拆分逗号分隔列

mysql - 在不使用 "unique"的情况下重写 SQL 中的 where 语句

php - 通过 jQuery.ajax 从 PHP 加载数组

php - 如何获取不同表中两个字段的总和?

MysqlDump 出现 ShellExecute 错误

mysql - 如何使用sql获取同一个表中的列总和然后2个表之间的差异