索引是帮助我们快速获取数据的数据结构。索引是在存储引擎中实现的,因此不同存储引擎的索引也不同。这里只介绍InnoDB存储索引所支持的BTree索引:
一、索引类型
为了方便举例子,先创建表person:
1、创建普通索引
2、创建唯一索引
3、主键
主键是特殊的唯一索引,必须指定为PRIMARY KEY,常使用AUTO_INCREMENT自增主键。
4、联合索引
多列联合建立的索引
该联合索引相当于一下三个索引:
name;
name, age;
name, age, telnumber;
而age和age,telnumber上没有索引,因为BTree索引遵循最左前缀原则。
二、索引优化
1、选择索引
可以考虑在where字句中出现的列或join字句出现的列上创建索引
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)
如果age是单列索引,order by使用索引;
(2)
若telnumber是单列索引,age不是索引或是单列索引,order by不能使用索引,因为MySQL每次查询的时候只能从众多索引中选择一个,而这次选择了telnumber。建立联合索引(telnumber, age),order by就能使用索引,注意遵循最左查询原则不要建立(age, telnumber)联合索引。
最后需要注意,MySQL对排序的记录大小有限制,当记录大于max_length_for_sort_data(1024)时,order by不能使用索引,只能使用using filesort。
更多order by请参考链接:http://blog.csdn.net/zht666/article/details/18010539