索引技术的应用使检索效率大幅度提高,但同时也增加了存储空间,使维护负担加重(不仅要维护主文件,还要同时维护索引文件)。
创建索引需要衡量索引性能的好坏:
- 访问时间
- 插入时间
- 删除时间
- 空间负载
- 支持存取的有效性:比如,支持的是属性的限定值(单一值),还是支持属性的限定范围的值(是否符合一定范围)
索引的建立原则:索引并不是越多越好。
适合建立索引的情况:
- 对于主键字段,需要建立唯一性索引或者主键索引
- 对于连接查询的字段(外键),可以建立索引
- 经常用来group by和order by的字段,可以建立索引
- 对于经常需要Distinct去重的字段,可以创建索引
- 对于会被频繁查询的字段,可以建立索引
- 在where子句中使用频繁的字段,可以建立索引
- 对于unique字段,可以建立唯一性索引,区分度最高
- 区分度(count(distinct colname)/count(*))高的列适合作为索引
- 使用字符串前缀创建索引:根据Alibaba开发手册,在字符串上建立索引时,必须指定索引长度,没有必要对全字段建立索引。
- 字段的数据类型的范围小的字段,可以根据实际需求创建索引:
- 数据类型越小,在查询时进行的比较操作越快
- 数据类型越小,索引占用的空间就越少,在一个数据页内就可以存下更多的记录,从而减少磁盘I/O带来的性能损耗,也就意味着可以存储更多的数据在数据页中,提高读写效率。
- 多表join连接时创建索引注意事项:首先,连接表的数据量尽量不超过3张,因为每增加一张表就相当于增加了一次嵌套的循环,数量级增长非常快,严重影响查询效率。其次,对where条件创建索引,因为where才是对数据条件的过滤,如果在数据量非常大的情况下,没有where条件过滤时非常可怕的。最后,对于连接的外键字段创建索引,并且该外键字段在多张表中的数据类型必须一致。
不适合建立索引的情况:
- 唯一性太差的字段,不要建立索引
- 不会出现在where子句中的字段,不要建立索引
- 更新频繁的字段,不适合建立索引
- 避免对经常更新的表创建过多的索引
- 不建议用无序的值作为索引,比如身份证号、UUID等无序长字符串
- 对于数据类型为text,blob,image,bit的字段,不适合建立索引
- 数据量小的表,最好不要使用索引
- 要定时删除不再使用或者很少使用的索引
- 不要创建冗余或重复的索引