Explain工具使用与索引详解

序言

Explain工具使用

建表示例

使用方式

Explain列说明

索引注意事项 

重点


序言

我们一步步的深耕,必将挖掘出属于我们的宝藏。

Explain工具使用

先附上官网文档说明的地址,更深入的大家自行查阅:MySQL :: MySQL 5.7 Reference Manual :: 8.8.2 EXPLAIN Output Format

建表示例

CREATE TABLE `test_author` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `utime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='作者表';

insert into test_author(id,name) values(1,'牛仔');
insert into test_author(id,name) values(2,'小海豚');

CREATE TABLE `test_boot` (
  `id` int(11) NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `common_index` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='出版书籍表';

insert into test_book(id,name)values(1,'西游记');
insert into test_book(id,name)values(2,'葫芦娃');

CREATE TABLE `author_id` (
  `id` int(11) NOT NULL,
  `author_id` int(11) DEFAULT NULL,
  `book_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `union_author_book` (`author_id`,`book_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into test_author_book values(1,1,1),(2,1,2);

使用方式

在我们正常的sql语句前面添加参数 explain

 

Explain列说明

  1. id : SQL语句总有几个sql语句就会有几个id编号,编号值越高,执行越早。如果id为空,则最后执行。
  2. select_type : 表示该语句是简单查询还是复杂查询。大体常用的有如下几种:

    (1) simple : 简单查询,该查询不包含子查询和union。例如:
    explain select * from test_author where id = 1; 
    (2) primary: 复杂查询中最外层的select。
    (3) subquery: select语句最为属性列的查询(非from之后的)。
    (4) derived: from之后的表是由select语句产生的。
    2,3,4示例如下:
    (未关闭对衍生表的合并优化前:)
    (关闭对衍生表的合并优化后:set session optimizer_switch='derived_merge=off';)
     
    (5) union: union之后的所有select语句。例如:
     
  3. table: 表示用的表是哪一个。
    当from语句中有子查询时,名字可能是<derivedN>,其中N为id所对应行的表。
    当有union时,名字可能是<union1,2>代表,id为1,2对应行的select。
  4. partions: SQL所属的分区是哪一个。
  5. type: SQL执行过程中有无用到索引。其值以及执行优先级为:
    system>const>eq_ref>ref>range>index>all
    我们优化一般都是尽量向range靠拢,最好达到ref.

    NULL :  执行效率最高的。可以理解表都不用查。例如:
                 select max(id),min(id) from test_book; 在一个排好序的二叉树里面,最大,最小我                 们只需要获取开头或者结尾的数值即可。
    CONST: 常量值查询。例如用主键或者唯一索引,只能得到一行。
    SYSTEM: 可以理解成常量查询的特例。例如从常量查询结果集中查询(即只有一条记录的常量派生表)
     EQ_REF: 关联表关联条件为主键或者唯一索引。且被关联表(test_book)所有字段都是索引。如果有一个字段是非索引,则类型会变成ALL.
    REF: 使用普通索引查询或联合索引最左匹配原则。 





    RANGE:  一般出现在 in,between,>,< 或>= 或模糊查询如 like '葫%'




    INDEX: 一般出现在覆盖索引所在的表中。如test_book表,通过查询二级索引就能获取所有数据。explain select * from test_book;


    ALL:  即要全表扫描。

     
  6. possible_keys: 即可能用到的索引。
  7. key: 语句中实际用到的索引。如果为NULL,说明没有使用。
  8. key_len: 用到索引所占用的字节数。规则如下:
                       char/varchar(n):如果非utf-8 则纯数字或者字母都是1个字节;汉字则是3个字节
                       char(n)=3n; varchar(n)=3n+2,其中2来存取字符串长度【因为varchar是变长字符                     串】;
    tinyint:1字节;smallInt:2字节;int:4字节;bigint:8字节;
    date:3字节;timestamp:字节;datetime:8字节;
    如果索引允许为NULL,则额外需要1个字节存储;索引最大长度为768个字节,字符串过长,则会将前部分字符串作为索引。
     
  9. ref: 这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名(库名.test_author.id)
  10. rows : mysql要检测的大概行数。
  11. extra :  展示的额外信息。
    Using Index:使用到了覆盖索引(要查询的字段为某个索引值或者联合索引的一部分)

    Using Where:查询语句使用到了where,且查询条件是非索引字段。
    Using index Condition: 查询语句使用到了where,且查询条件是索引字段。
    Using temporary: mysql需要创建一张临时表来处理数据。

    Using fileSort: 将用外部排序而不是内存排序

    Select tables optimized away:使用聚合函数比如max,min来查询索引字段。如果非索引字段那么Extra为NULL

 

索引注意事项 

  • 索引字段上不要进行函数操作:索引树是针对某个数值创建的索引,一旦运算,可能索引树找不到对应值,从而走全表扫描。
  • 联合索引中范围条件之后的索引失效:索引树是有序的数据结构,一旦有了范围,那么之后索引字段全局会变成无序。
  • 尽量使用覆盖索引
  • is (not) null 一般无法使用索引
  • like 'abc%' :前模糊查询会走查询,可以理解成字符串是ASCII,比较每个字符,相当于常量查询
     

重点

Mysql内部会有各种成本分析,或许查询的是索引数据,但是当总数量很少时会走全表扫描,即上面结论仅供参考,并非已成不变。

 

 

       
 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值