MySQL 索引分类 Explain解释

2020-05-26  本文已影响0人  攻城狮托马斯

五种索引:


普通索引:一个索引只包含单个列

唯一索引:索引列的值必须是唯一, 某个字段不能出现重复的值,比如身份证列,但可以出现一个null值 

复合索引: 一个索引包含多个列

聚簇索引(聚集索引): B+Tree, InnoDB,数据和Index放在一起

非聚簇索引: 不是聚簇索引,就是非聚簇索引.(MyIsam, 数据和索引是分开的)

基础语法


查看索引:

SHOW INDEX FROM table_name \G

创建索引:

CREATE [UNIQUE] INDEX indexName ON mytable(columnname(length));

ALTER TABLE 表名 ADD [UNIQUE] INDEX [indexName] ON (columnname(length)))

删除索引:

DROP INDEX [indexName] ON mytable

执行计划:首先看执行计划,而不是看语句猜执行计划


模拟优化器执行SQL查询语句,从而知道MySQL是如何分析语句。 分析查询语句或是表结构的性能瓶颈

EXPLAIN + SQL语句:

1.表的读取顺序

2.数据库操作的操作类型

3.哪些索引可以使用

4.哪些索引被实际使用

5.表之间的引用

6.每张表有多少行被优化器查询


表的读取顺序 // 有三种情况

id相同的情况下,按顺序执行,由上往下执行

id不相同的的情况下,id越大的越先执行.


Select Type(查询类型)

Primary: 首次查询

SubQuery: 子查询

Derived:由子查询产生的表,再在衍生表上进行查询.

Union: 两个表集合

Union Result是ID 1, 2的表的合集

Type

访问类型,较为重要的一个指标

system > const > eq_ref > ref > range > index > ALL(全表扫描)

system: 表里面就一条记录

const: 通过索引一次就找到了

eq_ref: 通过主键或唯一索引找到, 索引不存在重复

ref: 非唯一索引, 索引存在重复,所以需要对同样的索引进行遍历或者返回多行

range: 查询一个数据段中的

index: 索引表扫描,效率比ALL高一点点

ALL: 全表扫描,把叶子节点所有的数据都拿出来


Possible_keys / Key:

Possible_key: 可能用到的key

Key: 真正用到的索引

是否充分用到了索引: 看key_length, 如果充分用到了索引,那就一定比没有充分用到索引的key_length要长.


key_len:与char/varchar, 字符集, 长度, 是否为null相关

为null: + 1

varchar: + 2(有标识符位置)

ucf-8: 每个字符3字节

其他的都可以按照数据类型来算,不需要乘以长度, 如果为null再加一


Ref和Extra Info不是很懂

ref: 索引的哪一列被使用了,可能的话是一个常数,不是很懂


十分重要的额外信息:

Using fileSort: 如果索引用ABC排序,然后使用者在没有其他索引的情况下,用C,A排序,就会出现fileSort.

Using Temporary: 使用临时表,一般用Group By用临时表进行排序.

Using Index: 用到了覆盖索引.

上一篇下一篇

猜你喜欢

热点阅读