mysql的索引使用正确是否直接影响项目数据的crud性能。下面总结下个人对mysql索引的理解及两个使用原则。

一、索引模型

引擎为InnoDB时,索引的数据结构为B+树。具体的B+树结构我们可以看其他资料,下面主要总结下通过主键索引和二级索引查找数据的过程。

表基本信息:表名是t,主键是id,二级索引是K。

新建索引之前的数据可以有吗 建立索引后怎么使用_mysql

1.1通过主键索引查询

执行语句:

select * from t whree id=5;

执行过程:

a.第一次磁盘io,取出的数据页为p1;

b.由于所要查询的id为5,比7小,所以要进行第二次磁盘io,拿出磁盘页(p3);

c.在p3是叶子节点,是链表结构,可以直接按照顺序找到id(5)所对应的数据行R4。

主键索引特点:

1.中间节点存放的是主键

2.叶子结点的内容是数据页(Page),一个数据页可以放多个数据行(记录);

新建索引之前的数据可以有吗 建立索引后怎么使用_索引_02

1.2通过二级索引查询

执行sql:

select * from t where k='500'

执行过程:

a.第一次磁盘io,取出的数据页为p4;

b.由于所要查询的k为500,比700小,所以要进行第二次磁盘io,拿出磁盘页(p6);

c.在p6是叶子节点,是链表结构,可以直接按照顺序找到k(500)所对应的id(5);

d.根据id(5)再通过主键索引去查询,最后找到R4数据行。

二级索引的特点:

1.中间节点的内容是二级索引

2.叶子结点的内容是主键

新建索引之前的数据可以有吗 建立索引后怎么使用_索引_03

二、索引的最左前缀原则

索引index1:(a,b,c)
查询时
select * from table where a = '1'  
select * from table where a = '1' and b = ‘2’  
select * from table where a = '1' and b = ‘2’  and c='3'

按照a、b、c顺序走的,会走索引。b、a、c / c、a、b等不走索引。

因此在写查询时尽量遵循最左前缀原则。

三、利用覆盖索引原则

当所要查询的字段个数不是很多时,利用好覆盖索引进行查询操作, 避免回表。

file sort:

如果order by的列上有索引,那么就可以利用索引的有序性进行排序;

如果没有索引,那么就是file_sort,可以理解为外部排序,就是把select的数据,按照order by的列 ,在内存中进行一次排序,然后返回结果。

覆盖索引:

索引所拥有的字段能够满足查询的需求,而不用回表再去查找。

判断是否使用覆盖索引标准:

explain 执行语句,extra 列会出现: using index。