索引优化策略
-
索引类型 1.1 B-tree索引 注:名叫btree索引,大的方面看,都用平衡树,但具体实现上,各引擎稍有不同。 比如严格的说,NDB引擎使用的是T-tree,myisam,innodb使用的是B-tree索引。 B-tree系统可以理解为“排好序的快速查找结构” 1.2 hash索引 在memory表里,默认是hash索引,hash索引理论查询时间复杂度为O(1) 疑问:既然hash查找如此高效,为什么不都用hash索引? 答: 1.hash函数计算后的结果是随机的,如果在磁盘上放置数据, 比如主键是id为例,随着id的增长,id对应的行,在磁盘上随机放置 2.无法对范围查询进行优化 3.无法利用前缀索引。比如在btree中,field列的值“helloworld”,并加索引查询xx=helloworld,自然可以利用索引,xx=hello,也可以利用索引(左前缀索引)。因为hash(‘helloworld’),hash(‘hello’),两者的关系仍为随机 4.无法优化排序 5.必须回行。就是说,通过索引拿到数据位置,必须回到表中取数据 -
btree索引的常见误区 2.1 在where条件常用的列上都加上索引 例:where id = 1 and price = 2 ,对id和peice都建立索引,只能使用一个 2.2 在多列上建立索引后,查询哪个列,索引都将发挥作用 误:多列索引上,索引发挥作用,需要满足左前缀要求 以 index(a,b,c) 为例
语句 | 索引是否有效 |
---|
where a=1 | 是 | where a=1 and b= 2 | 是 | where a=1 and b= 2 and c= 3 | 是 | where b=2 或 where c= 3 | 否 | where a=1 and c= 2 | a是,c否 | where a=1 and b>2 and c= 3 | a,b是,c否 | where a=1 and b like ‘%2%’ and c =3 | a,b是,c否 |
2.3 示例 假设某表有一个联合索引(c1,c2,c3,c4) A.where c1 = x and c2 = x and c4 > x and c3 = x (c1,c2,c3,c4) B.where c1 = x and c2 = x and c4 = x order by c3 (c1,c2,c3) C.where c1 = x and c4 = x group by c2,c3 (c1) D.where c1 = ? and c5 = ? order by c2,c3 (c1,c2,c3) E.where c1 = ? and c2 = ? and c5 = ? order by c2,c3 (c1,c2,c3)
|