下面的两个查询做同样的事情。基本上显示表 1 的所有 ID,它们出现在表 2 中。令我困惑的是 simple select way way 比 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)
最佳答案
问:谁能详细说明一下?
答: 在我们走@a_horse_with_no_name 似乎迫不及待要追赶的“MySQL 中的错误”路线之前,我们真的需要确保这是可重复的行为,而不仅仅是一个怪癖。
要做到这一点,我们确实需要从多次运行的查询中查看耗时结果。
如果在服务器上启用了查询缓存,我们希望在添加了SQL_NO_CACHE
提示的情况下运行查询(SELECT SQL_NO_CACHE table1.id ...
),因此我们知道我们不会检索缓存的结果。
我会重复执行每个查询至少三次,然后抛出第一次运行的结果,并对其他运行进行平均。 (这样做的目的是消除表数据不在缓存中的影响,无论是 InnoDB 缓冲区还是文件系统缓存。)
此外,为每个查询运行一个 EXPLAIN SELECT ...
。并比较访问计划。
如果这些表中的任何一个是 MyISAM 存储引擎,请注意 MyISAM 表受 DML 操作锁定;当在表上运行 INSERT、UPDATE 或 DELETE 操作时,SELECT 语句将被阻止访问该表。 (但是 5 秒似乎有点长,除非这些表真的很大,或者 DML 语句效率很低)。
使用 InnoDB,SELECT 查询不会被 DML 操作阻塞。
耗时也将取决于系统上发生的其他事情。
但是总耗用时间将不仅仅包括 MySQL 服务器中的时间。暂时打开 MySQL general_log 将允许您捕获服务器实际正在处理的语句。
关于mysql - 速度选择与加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27988857/