MySQL查询计划学习

以select_type为线索:

1) SIMPLE:简单的SELECT,不实用UNION或者子查询

mysql> explain select * from t2;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | t2 | ALL | NULL | NULL | NULL | NULL | 100 | NULL |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)

2) PRIMARY:最外层SELECT。

mysql> explain select * from (select * from t2 where id2=2) b;
+----+-------------+------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+------+---------+------+------+-------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 100 | NULL |
| 2 | DERIVED | t2 | ALL | NULL | NULL | NULL | NULL | 100 | Using where |
+----+-------------+------------+------+---------------+------+---------+------+------+-------------+
2 rows in set (0.00 sec)

其中using where表示使用了where子句,过滤了元组

3) UNION:第二层,在SELECT之后使用了UNION。

mysql> explain select * from t1 union select * from t2;
+----+--------------+------------+------+---------------+------+---------+------+-------+-----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------+------------+------+---------------+------+---------+------+-------+-----------------+
| 1 | PRIMARY | t1 | ALL | NULL | NULL | NULL | NULL | 10208 | NULL |
| 2 | UNION | t2 | ALL | NULL | NULL | NULL | NULL | 100 | NULL |
| NULL | UNION RESULT | <union1,2> | ALL | NULL | NULL | NULL | NULL | NULL | Using temporary |
+----+--------------+------------+------+---------------+------+---------+------+-------+-----------------+
3 rows in set (0.00 sec)

其中using temporary表示使用了临时表保存中间结果。

4) DEPENDENT UNION:UNION语句中的第二个SELECT,依赖于外部子查询。
mysql> explain select * from t1 where id1 in (select id2 from t2 where id2<10 union select id3 from t3 where id3<5);
+----+--------------------+------------+------+---------------+------+---------+------+-------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+------------+------+---------------+------+---------+------+-------+--------------------------+
| 1 | PRIMARY | t1 | ALL | NULL | NULL | NULL | NULL | 10208 | Using where |
| 2 | DEPENDENT SUBQUERY | t2 | ALL | NULL | NULL | NULL | NULL | 100 | Using where |
| 3 | DEPENDENT UNION | t3 | ref | id3 | id3 | 5 | func | 1 | Using where; Using index |
| NULL | UNION RESULT | <union2,3> | ALL | NULL | NULL | NULL | NULL | NULL | Using temporary |
+----+--------------------+------------+------+---------------+------+---------+------+-------+--------------------------+
4 rows in set (0.00 sec)

其中possible_keys表示备选索引为id3,key表示经过优化器选定的索引为id3,type为ref表示使用单表t3扫描。

5) UNION RESULT:UNION的结果。

mysql> explain select * from t1 union select * from t2;
+----+--------------+------------+------+---------------+------+---------+------+-------+-----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------+------------+------+---------------+------+---------+------+-------+-----------------+
| 1 | PRIMARY | t1 | ALL | NULL | NULL | NULL | NULL | 10208 | NULL |
| 2 | UNION | t2 | ALL | NULL | NULL | NULL | NULL | 100 | NULL |
| NULL | UNION RESULT | <union1,2> | ALL | NULL | NULL | NULL | NULL | NULL | Using temporary |
+----+--------------+------------+------+---------------+------+---------+------+-------+-----------------+
3 rows in set (0.00 sec)

6) SUBQUERY:子查询中的第一个SELECT。

mysql> explain select * from t1 where id1=(select id2 from t2 where id2=2);
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| 1 | PRIMARY | t1 | const | PRIMARY | PRIMARY | 4 | const | 1 | NULL |
| 2 | SUBQUERY | t2 | ALL | NULL | NULL | NULL | NULL | 100 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
2 rows in set (0.00 sec)

其中type为const表示访问常量表,where条件筛选后至多有一条元组匹配。
key为PRIMARY表示主键为选定的索引

type: 表示表的连接类型,性能由好到坏,依次为,
system,表中只有一行,常量表。
const,单表中最多有一行匹配,如pramary key 或者 unique index
eq_ref,对于前面的每一行,此表中只查询一条记录,比如多表连接中,使用primary key 或 unique index
ref,与eq_ref 类似,区别在于不是primary key 或qunique index, 而是普通索引。
ref_or_null,与ref 类似,区别在于查询中包含对null的查询。
index_merge,索引合并优化
unique_subquery,in的后面是一个查询主键字段的子查询。
index_subquery,与unique_subquery类似,区别在于是查询非唯一索引字段的子查询。
range,单表中的范围查询。
index,对于前面的每一行,都通过查询索引来得到数据。
all,全表扫描。

7) DERIVED:被驱动的SELECT子查询

mysql> explain select * from (select * from t2 where id2=2) b;
+----+-------------+------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+------+---------+------+------+-------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 100 | NULL |
| 2 | DERIVED | t2 | ALL | NULL | NULL | NULL | NULL | 100 | Using where |
+----+-------------+------------+------+---------------+------+---------+------+------+-------------+
2 rows in set (0.00 sec)

MySQL查询计划学习

时间: 2024-10-12 07:42:26

MySQL查询计划学习的相关文章

MySQL查询计划输出列的含义

"一:MySQL查询计划输出列的含义:1.id:每个被独立执行的操作的标识,表示对象被操作的顺序:id值越大,先被执行:如果相同,执行顺序从上到下.2.select_type:查询中每个select子句的类型.3.table:名字,被操作的对象的名称,通常是表名,但有其他格式.4.partitions:匹配的分区信息(对于非分区表值为NULL).5.type:连接操作的类型.6.possible_keys:备选的索引(列出可能被使用到的索引).7.key:经优化器选定的索引:常使用ANALYZE

mysql查询计划

1:客户端发起查询请求 2:服务器接收到请求后,先查询缓存 如果缓存命中,直接返回数据给客户端 否则,解析sql 3:sql解析完成后,进行预处理 4:有查询优化器生存查询计划 5:通过api接口调用存储引擎 去磁盘访问需要查询的数据,再通过查询执行引擎返回给客户端 值得一提的是:mysql的客户端与服务端通信,采用的是半双工通信,即永远是只有一方在发送数据. 客户端发送完请求后,只能等待服务端的数据返回,这种协议让mysql通信简单快速,但也限制了流量包,在客户端无法 分块的发送请求,而服务端

mysql 从left join 到join到查询计划到联合索引的原理

left join left join在无脑使用中,会大表驱动小表,触发笛卡尔集,效率慢 join会自动小表驱动大表 参考: 从一个MySQL left join优化的例子加深对查询计划的理解 http://luxuryzh.iteye.com/blog/1976004 相关的explain查询计划解释 type分为system/const/eq_ref/ref/range/index/ALL等好几类,连接的效率从前往后 好..> 差 all:木有用到索引 index,用到 range,索引的b

[转]向facebook学习,通过协程实现mysql查询的异步化

FROM : 通过协程实现mysql查询的异步化 前言 最近学习了赵海平的演讲,了解到facebook的mysql查询可以进行异步化,从而提高性能.由于facebook实现的比较早,他们不得不对php进行hack才得以实现.现在的php5.5,已经无需hack就可以实现了.对于一个web网站的性能来说,瓶颈多半是来自于数据库.一般数据库查询会在某个请求的整体耗时中占很大比例.如果能提高数据库查询的效率,网站的整体响应时间会有很大的下降.如果能实现mysql查询的异步化,就可以实现多条sql语句同

MySQL的查询计划中ken_len的含义

本文首先介绍了MySQL的查询计划中ken_len的含义:然后介绍了key_len的计算方法:最后通过一个伪造的例子,来说明如何通过key_len来查看联合索引有多少列被使用. key_len的含义 在MySQL中,可以通过explain查看SQL语句所走的路径,如下所示: mysql> create table t(a int primary key, b int not null, c int not null, index(b)); Query OK, 0 rows affected (0

mysql学习——mysql查询语句综合练习

练习一: 设有成绩表stu如下: 姓名 科目 成绩 张三 数学 90 张三 语文 50 张三 地理 40 李四 语文 55 李四 政治 45 王五 政治 30 王五 数学 70 试查询两门及两门以上不及格同学的平均分 解答如下 1.创建数据表 create table stu(id int primary key auto_increment,name char(3) not null default'',subject char(3) not null default'',score deci

MySQL 执行计划explain详解

MySQL 执行计划explain详解 2015-08-10 13:56:27 分类: MySQL explain命令是查看查询优化器如何决定执行查询的主要方法.这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的. 调用EXPLAIN 在select之前添加explain,mysql会在查询上设置一个标记,当执行查询计划时,这个标记会使其返回关于执行计划中每一步的信息,而不是执行它.它会返回一行或多行信息,显示出执行计划中的每一部

MySQL 执行计划中Extra(Using where,Using index,Using index condition,Using index,Using where)的浅析

  关于如何理解MySQL执行计划中Extra列的Using where.Using Index.Using index condition,Using index,Using where这四者的区别.首先,我们来看看官方文档关于三者的简单介绍(官方文档并没有介绍Using index,Using where这种情况): Using index (JSON property: using_index) The column information is retrieved from the ta

MySQL执行计划解读

MySQL执行计划解读 http://www.cnblogs.com/ggjucheng/archive/2012/11/11/2765237.html MySQL执行计划解读 Explain语法 EXPLAIN SELECT -- 变体: 1. EXPLAIN EXTENDED SELECT -- 将执行计划"反编译"成SELECT语句,运行SHOW WARNINGS 可得到被MySQL优化器优化后的查询语句 2. EXPLAIN PARTITIONS SELECT -- 用于分区表