mysql的索引使用正确是否直接影响项目数据的crud性能。下面总结下个人对mysql索引的理解及两个使用原则。
一、索引模型
引擎为InnoDB时,索引的数据结构为B+树。具体的B+树结构我们可以看其他资料,下面主要总结下通过主键索引和二级索引查找数据的过程。
表基本信息:表名是t,主键是id,二级索引是K。
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),一个数据页可以放多个数据行(记录);
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.叶子结点的内容是主键
二、索引的最左前缀原则
索引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。