如何更好的创建索引

创建索引是一个经久不衰的话题,网上关于索引的使用方式与建议的资料比比皆是,其表述的意思在一定程度上也是大同小异。当然,作为这么一个经典的话题,要确切说清楚怎样用才是好的,那是不容易的,此处就本人一些使用过程中的积累做一些概述,有不足之处,还望多多指正。

1、较频繁的作为查询条件的字段应该创建索引.

2、唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件:

唯一性太差的字段:如状态字段,类型字段等。这些字段即使创建了单独的索引,MySQL Query Optimizer大多数也不会选择使用,如果什么时候选择了这种索引,可能会带来极大的性能问题。由于索引字段中每个值都含有大量的记录,那么存储引擎在根据索引访问数据的时候会带来大量的随机IO,甚至有时候可能还好出现大量的重复IO

       3、更新非常频繁的字段不适合创建索引:

更新字段数据,同时还要更新索引的数据,以确保索引信息是准确的,这会增加IO访问量较大的增加,不仅仅影响更新query的响应时间,还会影响真个存储系统的资源消耗,加大存储系统的负责。


单一索引还是复合索引

对于多个where条件的数据,组合索引会比单一索引的查询效率要高,因为通过单一索引所能过滤的数据并不完整,和通过组合索引相比,存储引擎需要访问更多的记录。但是组合索引在多个字段中存在,更新的频率会带来一定性能消耗。

       对于建立多个单键索引,MYSQL Query  Optimizer大多数时候只会选择一个单键值的索引,然后放弃其他索引。即使他选择了同时利用两个或者更多的索引通过INDEX_MERGE来优化查询,可能所收到的效果并不会比选择其中某一个单键值索引高效。

因为如果选择了INDEX_MERGE来优化查询,就需要访问多个索引,同时还要将通过访问到的几个索引进行merge操作,所带来的成本可能反而会比选择其中一个最有效的索引来完成查询更高。

在创建组合索引并不是说将查询条件中所有字段放在一个索引中,我们还应该尽量让一个索引被多个query语句使用,尽量减少同一个表上面索引的数量,减少因为数据更新所带来的索引更新成本。同时还可以减少因为索引所带来的存储空间的消耗。


大多数场景下比较适合:

1、对于单键索引,尽量选择针对当前query过滤性更好的索引;

2、在选择组合索引的时候,当前query中过滤性最好的字段在索引字段顺序中排列越靠前越好;

3、在选择组合索引的时候,尽量选择可以能够包含当前query的where子句中更多字段索引;

4、尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的而减少通过使用Hint人为控制索引的选择,因为这会是后期的维护成本增加,同时增加维护所带来的潜在风险。


建议:

1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响;

你可能感兴趣的:(数据库优化)