##索引类型
####B-Tree索引
####Hash索引
---
两种索引对比
1. hash函数计算后的结果不是连续的,因此可以认为是随机存储在磁盘上。
2. 无法进行范围查询优化,也无法利用前缀优化,排序优化。
3. 必须回行,通过索引拿到数据的位置,回到表里去数据。
###B-Tree索引
**原理**:B+树是一种平衡树,建树时安从这至右的顺序建立搜索树,查找时也应该按照从左至右的顺序查找。这就是索引的最左匹配性质。
如果建立索引(a,b,c)
* Where a=3 是,只使用了a列
* Where a=3 and b=5 是,使用了a,b列
* Where a=3 and b=5 and c=4 是,使用了abc
* Where b=3 / where c=4 否
* Where a=3 and c=4 a列能发挥索引,c不能
* Where a=3 and b>10 and c=7 A能利用,b能利用, C不能利用
* 同上,where a=3 and b like ‘xxxx%’ and c=7 A能用,B能用,C不能用
假设某个表有一个联合索引(c1,c2,c3,c4)一下——只能使用该联合索引的c1,c2,c3部分
* A where c1=x and c2=x and c4>x and c3=x
* B where c1=x and c2=x and c4=x order by c3
* C where c1=x and c4= x group by c3,c2
* D where c1=x and c5=x order by c2,c3
* E where c1=x and c2=x and c5=? order by c2,c3
A:等价于c1=x and c2=x and c3=x and c4>x 四个都能用上。
B:当order by ,group by中的字段出现在where条件中时,才会利用索引而不排序,更准确的说,order by 中的字段在执行计划中利用了索引时,不用排序操作。c3没有在where中,因此用了c1和c2.由于c1和c2,已经固定,所以c3已经是有序的了,该语句不用全表排序。
C:只用了C1。使用C3之前没有c2并不是固定的,因此需要全表排序。
D:只用了C1,但利用了c2和c3的索引,不用全表排序。
E:用了C1和c2,同样不用全表排序。