sql - 下面提到的查询的内部流程是什么?
问题描述
Select * from table t1 inner join table t2 on t1.id=t2.id
Select * from table t1,table t2 where t1.id=t2.id
根据性能,哪个查询是乐观查询?
解决方案
create table t1 (id int primary key);
create table t2 (id int primary key);
explain select * from t1 inner join t2 on t1.id = t2.id;
编号 | 选择类型 | 表| 隔断 | 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 过滤 | 额外的 -: | :------------ | :---- | :--------- | :----- | :------------ | :-------- | :-------- | :-------------------------------- | ---: | --------: | :---------- 1 | 简单 | t1 | 空 | 索引 | 初级 | 初级 | 4 | 空 | 1 | 100.00 | 使用索引 1 | 简单 | t2 | 空 | eq_ref | 初级 | 初级 | 4 | fiddle_NTBFHZQPZPTPOTLPGUEV.t1.id | 1 | 100.00 | 使用索引
explain select * from t1, t2 where t1.id = t2.id;
编号 | 选择类型 | 表| 隔断 | 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 过滤 | 额外的 -: | :------------ | :---- | :--------- | :----- | :------------ | :-------- | :-------- | :-------------------------------- | ---: | --------: | :---------- 1 | 简单 | t1 | 空 | 索引 | 初级 | 初级 | 4 | 空 | 1 | 100.00 | 使用索引 1 | 简单 | t2 | 空 | eq_ref | 初级 | 初级 | 4 | fiddle_NTBFHZQPZPTPOTLPGUEV.t1.id | 1 | 100.00 | 使用索引
db<>在这里摆弄
两个查询在功能上是相同的(它们产生相同的结果),优化器为它们产生相同的解释计划(至少在这个简单的 cas 中,并且可能在更复杂的查询中)。
但是,大多数 SQL 专家会告诉您,隐式连接语法(在from
子句中使用逗号)更难遵循,而且自 1992 年以来,ANSI SQL 标准建议使用显式连接(使用join ... on ...
语法)。我强烈建议遵循该建议。
相关阅读:
- 显式连接与隐式连接
- 显式与隐式 sql 连接
- 内连接 vs where
- 还有很多...
推荐阅读
- lua - 如何找到一个表的methatable
- google-closure-compiler - 属性 myMethod 从未在 myModel 上定义
- sql - 使用内连接代替子查询
- python - How can I subtract 2 columns if another column's value is same in pandas dataframe
- ssis - SSIS 作业需要“数小时”——所有执行报告未累加或显示错误——在哪里找到原因?
- forth - 第四 - 如何实现字来访问硬件寄存器中的位域?
- c# - ASP.NET Core - 异常处理不起作用
- arrays - 检索仅包含活动用户 ID 的对象
- c# - 使用 UWP broadFileSystemAccess 受限权限时无法读取/写入文件
- ios - 从 UITabBarController 调用时无法获取常用函数中的选项卡项