云数据库 RDS-数据库使用规范:数据库索引设计规范

时间:2023-12-14 19:03:36

数据库索引设计规范

  • 限制每张表上的索引数量,建议单张表索引不超过5个。索引并不是越多越好,索引可以提高查询的效率,但会降低写数据的效率。有时不恰当的索引还会降低查询的效率。
  • 禁止给表中的每一列都建立单独的索引。设计良好的联合索引比每一列上的单独索引效率要高出很多。
  • 每个InnoDB表强烈建议有一个主键,且不使用更新频繁的列作为主键,不使用多列主键,不使用UUID、MD5、字符串列作为主键。最好选择值的顺序是连续增长的列作为主键,所以建议选择使用自增ID列作为主键。
  • 建议在下面的列上建立索引:
    • 在SELECT,UPDATE,DELETE语句的WHERE从句上的列。
    • 在ORDER BY,GROUP BY,DISTINCT上的列。
    • 多表JOIN的关联列。
  • 索引列顺序:
    • 区分度最高的列放在联合索引的最左侧。区分度=列中不同值的数量/列的总行数。
    • 尽量把字段长度小的列放在联合索引的最左侧。因为字段长度越小,一页能存储的数据量越大,IO性能也就越好。
    • 使用最频繁的列放到联合索引的左侧。这样可以比较少的建立一些索引。
  • 避免冗余的索引,例如:primary key(id),index(id),unique index(id)
  • 避免重复的索引,例如:index(a,b,c),index(a,b),index(a),由于RDS for MariaDB查询优化器无法确定使用哪个索引,所以重复的和冗余的索引会降低查询效率。
  • 在VARCHAR字段上建立索引时,需指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。

    一般对字符串类型数据,长度为20的索引,区分度会高达90%以上,可以使用 count(distinct left(列名, 索引长度))/count(*) 的区分度来确定。

  • 对于频繁查询优先考虑使用覆盖索引。

    覆盖索引指包含了所有查询字段的索引,不仅仅是WHERE从句GROUP BY从句中的列,也包含SELECT查询的列组合,避免InnoDB表进行索引的二次查询。

  • 外键约束:

    建立外键关系的对应列的字符集必须保持一致或者存在外键关系的子表父表的字符集保持一致。

support.huaweicloud.com/usermanual-rds/maria_03_0003.html