索引技术的应用使检索效率大幅度提高,但同时也增加了存储空间,使维护负担加重(不仅要维护主文件,还要同时维护索引文件)。

    创建索引需要衡量索引性能的好坏:

    • 访问时间
    • 插入时间
    • 删除时间
    • 空间负载
    • 支持存取的有效性:比如,支持的是属性的限定值(单一值),还是支持属性的限定范围的值(是否符合一定范围)

    索引的建立原则:索引并不是越多越好。
    适合建立索引的情况:

    1. 对于主键字段需要建立唯一性索引或者主键索引
    2. 对于连接查询的字段(外键),可以建立索引
    3. 经常用来group by和order by的字段,可以建立索引
    4. 对于经常需要Distinct去重的字段,可以创建索引
    5. 对于会被频繁查询的字段,可以建立索引
    6. where子句中使用频繁的字段,可以建立索引
    7. 对于unique字段,可以建立唯一性索引,区分度最高
    8. 区分度(count(distinct colname)/count(*))高的列适合作为索引
    9. 使用字符串前缀创建索引:根据Alibaba开发手册,在字符串上建立索引时,必须指定索引长度,没有必要对全字段建立索引。image.png
    10. 字段的数据类型的范围小的字段,可以根据实际需求创建索引:
      1. 数据类型越小,在查询时进行的比较操作越快
      2. 数据类型越小,索引占用的空间就越少,在一个数据页内就可以存下更多的记录,从而减少磁盘I/O带来的性能损耗,也就意味着可以存储更多的数据在数据页中,提高读写效率。
    11. 多表join连接时创建索引注意事项:首先,连接表的数据量尽量不超过3张,因为每增加一张表就相当于增加了一次嵌套的循环,数量级增长非常快,严重影响查询效率。其次,对where条件创建索引,因为where才是对数据条件的过滤,如果在数据量非常大的情况下,没有where条件过滤时非常可怕的。最后,对于连接的外键字段创建索引,并且该外键字段在多张表中的数据类型必须一致。image.png

    不适合建立索引的情况:

    1. 唯一性太差的字段,不要建立索引
    2. 不会出现在where子句中的字段,不要建立索引
    3. 更新频繁的字段,不适合建立索引
    4. 避免对经常更新的表创建过多的索引
    5. 不建议用无序的值作为索引,比如身份证号、UUID等无序长字符串
    6. 对于数据类型为text,blob,image,bit的字段,不适合建立索引
    7. 数据量小的表,最好不要使用索引
    8. 要定时删除不再使用或者很少使用的索引
    9. 不要创建冗余或重复的索引