下面的两个问题做同样的事情。基本上显示表1中的所有id,它们都存在于表2中。让我感到困惑的是简单选择 方式比 JOIN ,我原本预计JOIN会慢一些,但不会那么多...... 5秒对0.2
任何人都可以详细说明这个吗?
SELECT table1.id FROM
table1,table2 WHERE
table1.id=table2.id
持续时间/获取0.295 / 0.028 (MySql Workbench 5.2.47)
SELECT table1.id
FROM table1
INNER JOIN table2
ON table1.id=table2.id
持续时间/获取5.035 / 0.027 (MySql Workbench 5.2.47)
答案 0 :(得分:0)
问:有人可以详细说明这个吗?
A:在我们进入“MySQL中的一个错误”路线之前,@ a_horse_with_no_name似乎不耐烦地竞争,我们确实需要确保这是可重复的行为,而不仅仅是怪癖。
为此,我们确实需要查看多次查询运行所耗用的时间。
如果在服务器上启用了查询缓存,我们希望运行添加了SQL_NO_CACHE
提示的查询(SELECT SQL_NO_CACHE table1.id ...
),因此我们知道我们没有检索缓存结果。
我会重复执行每个查询至少三次,并从第一次运行中抛出结果,并平均其他运行。 (这样做的目的是消除不在缓存中的表数据,InnoDB缓冲区或文件系统缓存的影响。)
此外,为每个查询运行EXPLAIN SELECT ...
。并比较访问计划。
如果这些表中的任何一个是MyISAM存储引擎,请注意MyISAM表受DML操作的锁定;在表上运行INSERT,UPDATE或DELETE操作时,SELECT语句将被阻止访问该表。 (但是五秒钟似乎有点多,除非这些是非常大的表,或者是非常低效的DML语句)。
使用InnoDB,DML操作不会阻止SELECT查询。
经过的时间也取决于系统上还有什么。
但总耗用时间不仅仅包括MySQL服务器中的时间。暂时启用MySQL general_log将允许您捕获服务器实际处理的语句。
答案 1 :(得分:0)
如果您确实在完全相同的上下文中运行两个查询,这看起来像是可以由数据库引擎进一步优化的东西。
SQL是声明性的。通过成功声明您想要的内容,引擎可以自由重新调整您的请求的“如何”以恢复最快的结果。
最早的SQL版本甚至没有关键字JOIN。只有逗号。
SQL中有许多编码结构强制要求单一的劣等方法而不是另一种方法,应该避免使用它们。不应该避免加入。有些事听起来像是错过了。 JOIN是SQL的核心元素。总是不得不使用逗号会很遗憾。
基于您的环境,架构和数据,JOIN的性能有很多因素。您的table1和table2可能代表了可能已经超越优化算法的边缘情况。
答案 2 :(得分:0)
SQL_NO_CACHE工作,新结果是:
持续时间/获取5.065 / 0.027,用于选择where和 持续时间/获取联接
的5.050 / 0.027我原本以为“选择哪里”会更快,但加入实际上是一点点变化。但差异可以忽略不计
我要感谢大家的回应。