FLEXUS云服务_FLEXUS云数据库RDS-FlexusRDS for MySQL数据库使用规范:数据库索引设计规范
数据库索引设计规范
- 每个InnoDB表强烈建议有一个主键,且不使用更新频繁的列作为主键,不使用多列主键。不使用UUID、MD5、字符串列作为主键。最好选择值的顺序是连续增长的列作为主键,所以建议选择使用自增ID列作为主键。
- 限制每张表上的索引数量,建议单张表索引不超过5个。索引并不是越多越好,索引可以提高查询的效率,但会降低写数据的效率。有时不恰当的索引还会降低查询的效率。
- 禁止给表中的每一列都建立单独的索引。设计良好的联合索引比每一列上的单独索引效率要高出很多。
- 建议在下面的列上建立索引:
- 在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),重复的和冗余的索引会降低查询效率,因为Flexus云数据库RDS查询优化器会不知道该使用哪个索引。
- 在VARCHAR字段上建立索引时,需指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。
一般对字符串类型数据,长度为20的索引,区分度会高达90%以上,可以使用 count(distinct left(列名, 索引长度))/count(*) 的区分度来确定。
- 对于频繁查询优先考虑使用覆盖索引。
覆盖索引指包含了所有查询字段的索引,不仅仅是WHERE从句GROUP BY从句中的列,也包含SELECT查询的列组合,避免InnoDB表进行索引的二次查询。
- 外键约束: