什么是索引,如何优化索引(explain性能分析)
索引:
帮助Mysql高效获取数据的数据结构
在数据库中,维护着这样的一种数据结构(索引),这种数据结构(索引)以某种方式指向数据。所以索引一般也很大,存在磁盘中。
我们平时说的索引,如果没有特别指明,一般指B树。其中有聚集索引、次要索引、覆盖索引、复合索引、前缀索引、唯一索引、默认都是B+树索引。
索引分类:
单值索引:
一个索引只包含单个列,一个表可以有多个单列索引。
唯一索引:
索引列的值必须唯一但允许是空值。
复合索引:
一个索引包含多个列。
索引使用场景:
适合建索引的场景:
- 主键自动建立唯一索引。
- 频繁作为查询条件的字段。
- 查询中与其他表所关联的字段,外键等。
- 查询中排序的字段,排序字段如果通过索引去访问,将大大提高效率
- 查询中统计或分组的字段。
不适合建索引的场景:
- 频繁更新的字段或表。
- Where条件里用不到的字段。
- 表记录太少
- 某个列所包含的数据有太多重复的内容,如状态:(1.通过,2.不通过),没必要建立索引。
explain性能分析:
explain+SQL。 执行
会出现一张表。主要体现了该条Sql的执行情况。
各个字段解释:
id:Sql查询的序列号,表示查询中执行select子句或操作表的顺序
有三种情况:
1. id相同:执行顺序从上而下。
2. id不同,如果是子查询,id会递增,id越大的表优先级越高,越先被执行。
3. id有相同的也有不同的。相同的可以认为是一组,顺序由上往下执行。除此之外,id越大越先执行。
其中derived代表虚拟表的意思,derived2代表当前记录是id为2的记录的虚拟衍生表。
select_type:查询类型,主要用于区别普通查询、联合查询、子查询等复杂查询
table:表名
type:访问类型,显示查询使用了何种类型。
从好到差依次是:
system>const>eq_ref>ref>range>index>All
- system:表中只有一行记录
- const:根据索引查出一条数据,并且该sql在where条件后使用了主键唯一索引,并赋予常量。如SELECT * from student where id = 1
- eq_ref:唯一索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
- ref:非唯一索引扫描,返回匹配的所有行。
- range:使用了索引,但条件使用了between,<,>,in等范围查询。没有遍历全索引
- index:遍历了全索引,如:Select 主键 from 表名
- all:全表扫描
possible_keys:显示可能应用在这张表的索引名,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。
key:实际使用的索引名,如果没用就是null。若查询中使用了覆盖索引,则该索引仅出现在key列表中
什么是覆盖索引?
select的字段的名称,数量和先后顺序,和建立的复合索引的名称,数量先后顺序相同。
就可以直接在索引上取到数据,不用再回表中查询其他字段了
key_len:索引长度(字节数)
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引上的值。
rows:每张表有多少行被优化查询
Extra:包含不合适在其他列中显示但十分重要的额外信息
好了 基本已经讲完,欢迎大家评论区指出不足,一起学习进步!
大家看完了点个赞,码字不容易啊。。。