MySQL 索引分类 Explain解释
五种索引:
普通索引:一个索引只包含单个列
唯一索引:索引列的值必须是唯一, 某个字段不能出现重复的值,比如身份证列,但可以出现一个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: 用到了覆盖索引.