更新时间:2023-08-17 GMT+08:00
分享

索引规范

  • 避免因为字段类型不同造成的隐式转换,导致索引失效。
  • 业务上具有唯一特性的字段,即使是多个字段的组合,建议在所有具有唯一特性字段的最小集合上建立唯一索引。
    例如:一个表含有有a,b,c,d,e,f字段,在业务上ab和ef分别是具有唯一特性的字段集合,那么最好在最小集合ab和ef上分别建立唯一索引。

    即使在应用层做了完善的校验控制,只要没有唯一索引,根据墨菲定律,必然有脏数据产生。

    同时需要考虑建立的唯一索引对查询是否真正有帮助,没有帮助的索引可以考虑删除;

    需要考虑多建立的索引对插入性能的影响,根据唯一性相关的数据正确性需求,以及性能需求来权衡是不是需要多建立唯一性索引。

  • 尽量在定长的字段(如:INT)上建立索引;在varchar字段上建立索引时,必须指定索引长度,无需对全字段建立索引,根据实际文本区分度决定索引长度即可。

    索引长度与区分度是一对矛盾体,一般对字符串类型数据,长度为20的索引区分度会高达90%以上,可以使用count(distinct left(列名,索引长度))/count(*)的区分度来确定。(有区分度的放前面,没有区分度的放后面)。

  • 页面搜索避免使用左模糊(如:SELECT * FROM users WHERE u_name LIKE ‘%hk’)或者全模糊,避免从索引扫描退化为全表扫描,如果需要请在应用层解决。

    索引文件具有B-tree的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引。

  • 利用覆盖索引来进行查询操作,避免回表,但是覆盖索引加的字段不能太多,要兼顾写性能。

    能够建立索引的种类:主键索引、唯一索引、普通索引,而覆盖索引是一种查询的效果,利用explain的结果,extra列会出现:using index。

  • SQL性能优化的目标:至少要达到range级别,要求是ref级别,如果可以是consts最好。
  • 创建组合索引的时候,区分度最高的在左边。
  • 单张表的索引数量控制在5个以内,或不超过表字段个数的20%。
  • 创建索引避免有如下误解:
    • 宁滥勿缺。误认为一个查询就需要建一个索引。
    • 宁缺勿滥。误认为索引会消耗空间、严重拖慢更新和新增速度。
    • 抵制唯一索引。误认为业务的唯一性一律需要在应用层通过“先查后插”方式能解决。
分享:

    相关文档

    相关产品