MySQL多列索引
1 INNODB引擎为什么适用B+树,而不适用hash?
1.1 hash的特点
哈希优点:
- 单向存取速度快,速度位O(1)
哈希缺点: - 1.哈希值随意,导致记录存放的位置是随机的。mysql的随机存取性能很差。
- 2.哈希在范围查询上表现很差
- 3.哈希不利于排序
- 4.无法利用前缀索引。例如,hello,world 和hello,innodb中可以建立联合索引,适用xx=hello和xx=hello,world都可以适用到索引。但是hello和hello, world两个字符串的哈希值都不同,导致两者之间没有关系,无法建立索引。
1.2 B+树的特点
优点:
- 可以认为B+树是一个排好序的结构化表,对范围查找、排序方面性能很好。
innodb联合索引的最左前缀匹配规则
对于某个插叙语句,例如where c1=a and c2=b,要建索引,联合索引(c1, c2)的效果要比单独给每个查询列建立索引的效果要好。单独给每个列建立索引,则只会适用到索引列c1,而联合索引则能够同时适用两个列的索引。
实际应用最常用的是联合索引。
最左前缀匹配的规则如下:
- 匹配的时候从左向右逐步匹配。中间不能缺少索引项。例如对于索引(a, b, c), 相当于建立了三个索引(a), (a,b), (a,b,c)。对于(b), (c), (b, c)索引是没法使用的。类似where b=xx and c=xxx是使用不了索引的,因为从左向右匹配,没有符合要求的索引。
- =,in可以乱序。例如,where a=1 and b=2 和 where b=2 and a=1是一样的效果。MYSQL的优化器会对这种条件进行优化。使两者都能使用(a,b)这个索引。
- 遇到<, >, like, between,匹配会停止。但是会使用到呗停止的当前列。对于索引(a,b,c,d)索引,where a=1 and b=2 and c>3 and d=4则,只会用到索引(a, b, c)
- 如果order by的是索引列,则该列可以使用索引,并继续向右匹配。
网友评论