索引是帮助我们快速获取数据的数据结构。索引是在存储引擎中实现的,因此不同存储引擎的索引也不同。这里只介绍InnoDB存储索引所支持的BTree索引:

一、索引类型

  为了方便举例子,先创建表person:

    

mysql uniq索引 mysql on 索引_MySQL

  1、创建普通索引

    

mysql uniq索引 mysql on 索引_mysql uniq索引_02

  2、创建唯一索引

    

mysql uniq索引 mysql on 索引_mysql uniq索引_03

  3、主键

    主键是特殊的唯一索引,必须指定为PRIMARY KEY,常使用AUTO_INCREMENT自增主键。

  4、联合索引

    多列联合建立的索引

    

mysql uniq索引 mysql on 索引_字段_04

    该联合索引相当于一下三个索引:

     

name;
name, age;
name, age, telnumber;

    而age和age,telnumber上没有索引,因为BTree索引遵循最左前缀原则。

二、索引优化

1、选择索引

  可以考虑在where字句中出现的列或join字句出现的列上创建索引

          

mysql uniq索引 mysql on 索引_MySQL_05

2、最左前缀原则

  对于联合索引(name, age, telnumber),B+树是按照从左到右的顺序建立搜索树的;如('zhangsan', '18', '15237502296'),先匹配name字段来确定搜索方向,name匹配成功再匹配age字段、telnumber字段,最终检索到目标数据。

  该联合索引是三级索引,从左到右依次去匹配,一个字段匹配成功才能去匹配下个字段,拿('18','15237502296')来检索时,因为没有拿到一级索引,无法确定下一步索引方向。('zhangsan',  '15237502296')来索引时情况一样,name匹配成功后,没有age这个二级索引,只能在name相同的情况下,去遍历所有的telnumber。

  B+树的数据结构决定了,使用的时候必须遵循最左前缀原则,尽量将经常参与查询的字段放在联合索引的最左边。

3.like的使用

  一般情况不建议使用like,若非使用不可的话,注意like '%aa%'不能使用索引,like 'aaa%'可以使用索引。这也是最左前缀原则的一个使用场景。

4、不能使用索引的说明

  MySQL按照联合索引从左到右匹配,直到遇见范围查询,如>,<,between,like等就停止匹配,a = 1 and b = 2 and c > 3 and d = 4,如果建立联合索引(a, b, c, d),d是不会使用索引的,若索引顺序是(a, b, d,c),a,b,c,d都会使用索引,只是c最终是一个范围值。

5、order by

  order by有两种排序方式:(1)using filesort使用算法在内存中进行排序(慢);(2)使用索引进行排序(快)

  (1)

mysql uniq索引 mysql on 索引_联合索引_06

   如果age是单列索引,order by使用索引;

  (2)  

mysql uniq索引 mysql on 索引_MySQL_07

  若telnumber是单列索引,age不是索引或是单列索引,order by不能使用索引,因为MySQL每次查询的时候只能从众多索引中选择一个,而这次选择了telnumber。建立联合索引(telnumber, age),order by就能使用索引,注意遵循最左查询原则不要建立(age, telnumber)联合索引。

  最后需要注意,MySQL对排序的记录大小有限制,当记录大于max_length_for_sort_data(1024)时,order by不能使用索引,只能使用using filesort。