mysql - 速度选择与加入

标签 mysql select join

下面的两个查询做同样的事情。基本上显示表 1 的所有 ID,它们出现在表 2 中。令我困惑的是 simple select way wayJOIN 快,我原以为 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/

相关文章:

php - codeigniter:无法使用连接检索数据

php - 如何通过 mysql_query 生成 HTML 站点地图?

mysql - 超过 6 个月但不更新的客户

mysql删除某个字符

mysql - 从一列中选择电话号码到多列sql

c++ - winsock 选择函数出现堆栈溢出异常 (0xC00000FD)

SQL Select ID 没有具有相同 ID 的重复行

java - 加入带注解的hibernate

jquery - 取消选择使用 .select() 在输入中选择的内容

MySQL 只选择早于 2 天的最新记录(时间戳)