多列(联合)索引生效规则

索引优化策略

1、索引类型

  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. 必须回行,就是说通过索引拿到数据位置,必须回到表中取数据。

 

2、btree索引的常见误区

  2.1 在where条件常用的列上都加上索引

  例:where cat_id=3 and price>100;  // 查询第3个栏目,100元以上的商品

  误:cat_id 和 price 都加上索引。

  错:只能用上 cat_id 或 price 索引,因为是独立的索引,同时只能用上1个。

 

  2.2 在多列上建立索引后,查询哪个列,索引都将发挥作用。、

  误:多列索引上,索引发挥作用,需要满足左前缀要求。

 

posted on 2020-08-12 21:23  金麟岂是池中物—潜龙  阅读(211)  评论(0)    收藏  举报

导航