高性能索引策略二
多列索引
一个误区:一个常见的错误就是,为每个列创建独立的索引,或者按照错误的顺序创建多了索引。
1. 为什么要建立多了索引
在每个列创建独立索引一般是由于听到诸如“吧where条件里面的列都建立上索引”这样模糊的建议导致的,实际上这个建议的非常错误的,在多个列上简历独立的单列索引大部分情况下并不能提高mysql的查询性能。
索引合并策略:
mysql5.0和更新版本引入了一种叫“做阴合并”的策略,一定程度上可以使用表上的多个单列索引来定位指定的行,更早版本的mysql只能使用其中某一个单列索引,然而这种情况下没有哪一个独立的单列索引是非常有有效的,例如在file_id和actor_id上各有一个单列索引。但对于下面的这个查询where条件,这俩个单列索引都不试最好的选择;
mysql>select file_id,actor_id form file_actor where file_id = 1 or actor_id = 1;
在老的mysql版本中,mysql会对这个查询使用权标扫描,但在mysql5.0和更新版本中,查询能够同时使用这俩个单列索引进行扫描,并将结果合并,这种算法有三个变种:or条件的联合(union),and条件的相交(intersection),组合前俩种情况下的联合和相交。
什么时候使用多了索引
当服务器对多个索引做相交操作时(通常有多个and条件)
当服务器对多个索引做联合操作时(通常有多个or条件)
2.选择合适的索引列顺序
在一个b-tree索引中,索引列的顺序意味着索引首先按照最左列进行排序(最左原则),其次是第二列,等等。(顺便说明本篇文章内容使用于b-tree索引,哈希索引或者其他类型索引并不会想b-tree索引一样按照顺序存储数据)
对于如何选择索引列顺序有一个检验法则:将选择性最高的列放在做索引的最前列。
上一篇: Vue学习之路第二篇:插值表达式