多列(联合)索引生效规则
索引优化策略
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) 收藏 举报