资讯专栏INFORMATION COLUMN

MySQL查询计划学习

kel / 2982人阅读

摘要:其中表示使用了子句,过滤了元组第二层,在之后使用了。其中表示使用了临时表保存中间结果。子查询中的第一个。其中为表示访问常量表,条件筛选后至多有一条元组匹配。被驱动的子查询

以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 |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
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 |  | ALL | NULL | NULL | NULL | NULL | 100 | NULL |
| 2 | DERIVED | t2 | ALL | NULL | NULL | NULL | NULL | 100 | Using where |
+----+-------------+------------+------+---------------+------+---------+------+------+-------------+
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 |  | ALL | NULL | NULL | NULL | NULL | NULL | Using temporary |
+----+--------------+------------+------+---------------+------+---------+------+-------+-----------------+
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 |  | 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 |  | ALL | NULL | NULL | NULL | NULL | NULL | Using temporary |
+----+--------------+------------+------+---------------+------+---------+------+-------+-----------------+
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 |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
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 |  | ALL | NULL | NULL | NULL | NULL | 100 | NULL |
| 2 | DERIVED | t2 | ALL | NULL | NULL | NULL | NULL | 100 | Using where |
+----+-------------+------------+------+---------------+------+---------+------+------+-------------+
rows in set (0.00 sec)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/46380.html

相关文章

  • MySQL探秘(二):SQL语句执行过程详解

    摘要:表示只有在查询语句中明确写明的语句才会放入查询缓存。查询优化器查询优化器会将解析树转化成执行计划。生成执行计划的过程会消耗较多的时间,特别是存在许多可选的执行计划时。使用基于成本的查询优化器,。 showImg(https://segmentfault.com/img/bVbex5v?w=750&h=562); 昔日庖丁解牛,未见全牛,所赖者是其对牛内部骨架结构的了解,对于MySQL亦...

    baukh789 评论0 收藏0
  • 记一次 MySQL 查询优化

    摘要:最近在学习查询优化的知识,正在阅读简朝阳编写的性能调优与架构设计,受益良多。还有一个关联查询,这个也是可能会出现性能问题的点,但还是会有一定的优化套路可用的。到这里,这条慢查询的优化就暂时告一段落了。 最近在学习 MySQL 查询优化的知识,正在阅读简朝阳编写的《MySQL性能调优与架构设计》,受益良多。 作者先介绍了 MySQL 的基础知识,比如 MySQL 的架构组成,有哪些存储引...

    Mr_houzi 评论0 收藏0
  • 自制小工具大大加速MySQL SQL语句优化(附源码)

    摘要:如果语句中使用了子查询集合操作临时表等情况,会给列带来很大的复杂性。会递归执行这些子查询,把结果放在临时表里。查询优化器从中所选择使用的索引。该字段显示了查询优化器通过系统收集的统计信息估算出来的结果集记录条数。 引言 优化SQL,是DBA常见的工作之一。如何高效、快速地优化一条语句,是每个DBA经常要面对的一个问题。在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤。然...

    Yu_Huang 评论0 收藏0
  • 自制小工具大大加速MySQL SQL语句优化(附源码)

    摘要:如果语句中使用了子查询集合操作临时表等情况,会给列带来很大的复杂性。会递归执行这些子查询,把结果放在临时表里。查询优化器从中所选择使用的索引。该字段显示了查询优化器通过系统收集的统计信息估算出来的结果集记录条数。 引言 优化SQL,是DBA常见的工作之一。如何高效、快速地优化一条语句,是每个DBA经常要面对的一个问题。在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤。然...

    zhunjiee 评论0 收藏0
  • 自制小工具大大加速MySQL SQL语句优化(附源码)

    摘要:如果语句中使用了子查询集合操作临时表等情况,会给列带来很大的复杂性。会递归执行这些子查询,把结果放在临时表里。查询优化器从中所选择使用的索引。该字段显示了查询优化器通过系统收集的统计信息估算出来的结果集记录条数。 引言 优化SQL,是DBA常见的工作之一。如何高效、快速地优化一条语句,是每个DBA经常要面对的一个问题。在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤。然...

    Hujiawei 评论0 收藏0

发表评论

0条评论

kel

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<