mysql中explain输出列之id的用法详解
参考mysql5.7 en manual,对列id的解释:
The SELECT identifier. This is the sequential number of the SELECT within the query. The value can be NULL if the row refers to the union result of other rows. In this case, the table column shows a value like <unionM,N> to indicate that the row refers to the union of the rows with id values of M and N.
翻译:SELECT标识符,它是查询里的SELECT的顺序编号,如果这行涉及其他行联合的结果,这个值可能是NULL。在这种情况下,explain输出列中的table列会展示一个像<unionM,N>的值来指出该行涉及带id值为M和N的行的联合。
示例
# 快速创建三个表tb1, tb2, tb3
# 创建tb1
mysql> create table tb1(
-> id int unsigned not null primary key auto_increment comment '主键,自增',
-> name varchar(30) not null default '' comment '姓名'
-> ) engine=innodb auto_increment=1 default charset=utf8 collate=utf8_general_ci;
Query OK, 0 rows affected (0.01 sec)
# 创建tb2
mysql> create table tb2 like tb1;
Query OK, 0 rows affected (0.02 sec)
# 创建tb3
mysql> create table tb3 like tb1;
Query OK, 0 rows affected (0.02 sec)
一,id相同,按table列由上至下顺序执行
# id都是1,值相同,执行顺序是从上至下依次是tb1, tb2, tb3
mysql> explain select tb2.* from tb1, tb2, tb3 where tb1.id=tb2.id and tb1.id=tb3.id and tb1.name='jerry';

二,id不同,如果是子查询,id的序号会递增,id的值越大优先级越高,越先被执行
# 分别向三个表中插入记录
mysql> insert into tb1 values(null, 'tom');
Query OK, 1 row affected (0.00 sec)
mysql> insert into tb2 select * from tb1;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> insert into tb3 select * from tb1;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from tb1, tb2, tb3;
+----+------+----+------+----+------+
| id | name | id | name | id | name |
+----+------+----+------+----+------+
| 1 | tom | 1 | tom | 1 | tom |
+----+------+----+------+----+------+
1 row in set (0.00 sec)
# id不相同并且子查询的id是递增的,此时table列的执行顺序是tb3, tb1, tb2
# tb3的id是3优先被执行,其次是tb1, tb2
mysql> explain select tb2.* from tb2 where id=(select id from tb1 where id=(select tb3.id from tb3 where tb3.name='tom'));

三,id相同不同,同时存在
# id相同都是1,顺序执行依次是tb3, tb2
mysql> explain select tb2.* from (select tb3.id from tb3 where tb3.name='') as n1, tb2 where n1.id=tb2.id;

在上面的例子中没有模拟出id相同不同混合的情况,可以看下下面的截图

如上图所示,id如果相同,可以认为是一组,(本组内)从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行。
四,对于使用union的情况
# id有相同也有不同,相同id为一组,所以执行顺序为tb1, tb2, tb3
mysql> explain select tb3.* from tb3 union select tb2.* from (select tb1.* from tb1) as n1, tb2;

总结

注意:以上示例显示的结果是在centos7和mysql5.7.26上测试所得,其他mysql版本或环境结果可能会有所不同。
欢迎访问我的个人站点:瑾年笔记
mysql中explain输出列之id的用法详解的更多相关文章
- Python中第三方库Requests库的高级用法详解
Python中第三方库Requests库的高级用法详解 虽然Python的标准库中urllib2模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人实在感觉不好.它已经不适合现在的时代, ...
- Mysql导入导出工具Mysqldump和Source命令用法详解
Mysql本身提供了命令行导出工具Mysqldump和Mysql Source导入命令进行SQL数据导入导出工作,通过Mysql命令行导出工具Mysqldump命令能够将Mysql数据导出为文本格式( ...
- [转]Mysql导入导出工具Mysqldump和Source命令用法详解
Mysql本身提供了命令行导出工具Mysqldump和Mysql Source导入命令进行SQL数据导入导出工作,通过Mysql命令行导出工具Mysqldump命令能够将Mysql数据导出为文本格式( ...
- JavaScript中return的用法和this的用法详解
JavaScript中return的用法详解 最近,跟身边学前端的朋友了解,有很多人对this和函数中的return的用法和意思理解的比较模糊,这里写一篇博客跟大家一起探讨一下return和this的 ...
- MySQL中tinytext、text、mediumtext和longtext详解
一.数字类型 类型 范围 说明 Char(N) [binary] N=1~255 个字元binary :分辨大小写 固定长度 std_name cahr(32) not null VarChar( ...
- mysql 中tinytext、text、mediumtext和longtext详解
一.数字类型 类型 范围 说明 Char(N) [ binary] N=1~255 个字元binary :分辨大小写 固定长度 std_name cahr(32) not null VarChar ...
- 【blog】MySQL中tinytext、text、mediumtext和longtext详解
参考链接 http://www.cnblogs.com/pureEve/p/6015000.html
- MySQL中tinytext、text、mediumtext和longtext详解【转】
一.数字类型 类型 范围 说明 Char(N) [binary] N=1~255 个字元binary :分辨大小写 固定长度 std_name cahr(32) not null VarChar( ...
- Python中内置的日志模块logging用法详解
logging模块简介 Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用.这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/P ...
随机推荐
- 【bzoj3195】【 [Jxoi2012]奇怪的道路】另类压缩的状压dp好题
(上不了p站我要死了) 啊啊,其实想清楚了还是挺简单的. Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期 ...
- 【bzoj4551】[Tjoi2016&Heoi2016]树
*题目描述: 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结 ...
- R 文件读写
Write.table()函数的用法read.table()非常相似,只不过它把数据框写入文件而不是从文件中读取.参数和选项: write.table(x, file = "", ...
- Linux下JDK1.7升级1.8版本
先下载 jdk-8u45-linux-x64.rpm 然后上传到 /usr/local/src 去.当然其他目录也可以.这里是默认位置 给所有用户添加可执行权限 #chmod +x jdk-8u4 ...
- ES6 嵌套数组进行解构
let [foo, [[bar], baz]] = [1, [[2], 3]]; foo // 1 bar // 2 baz // 3 let [ , , third] = ["foo&qu ...
- telnet测试端口是否打开?
如何测试远程服务器的某个端口是否打开? 例如: telnet 192.168.1.1 5000 返回: Trying 127.0.0.1...Connected to 127.0.0.1.Escape ...
- duration of lease 1 0.5 0.875 DHCP 租借时间 续租时间 重新绑定时间
w
- 剑指 Offer——最小的 K 个数
1. 题目 2. 解答 2.1. 方法一--大顶堆 参考 堆和堆排序 以及 堆的应用,我们将数组的前 K 个位置当作一个大顶堆. 首先建堆,也即对堆中 [0, (K-2)/2] 的节点从上往下进行堆化 ...
- 内置函数zip,map,even
内置函数的补充:1.zip:l1 = ['a','b','c','e','f','g']l2 = [1,2,3]l3=['A','B','C']L4=['牛','牛','niu']#zip,就是把俩l ...
- cookie/http/https
今天再学习顺便外加复习下http的相关知识,顺便试试在笔记中导出一个长篇的图片回事怎么样的效果. HTTP相关知识,不是很全仅供参考