数据库使用规范 数据库字段设计规范 控制单表字段数量,字段上限50左右。 优先为表中的每一列选择符合存储需要的最小的数据类型。优先考虑数字类型,其次为日期或二进制类型,最后是字符类型。列的字段类型越大,建立索引占据的空间就越大,导致一个页中的索引越少,造成IO次数增加,从而影响性能。 整数型选择能符合需求的最短列类型,如果为非负数,声明需是无符号(UNSIGNED)类型。 每个字段尽可能具有NOT NULL属性,int等数字类型默认值推荐给0,varchar等字符类型默认值给空字符串。 避免使用ENUM类型,可以用TINYINT类型替换。 1. 修改ENUM值需要使用ALTER语句,ENUM类型的ORDER BY操作效率低,需要额外操作。 2. 如果定义了禁止ENUM的枚举值是数值,可使用其他数据类型(如char类型)。 实数类型使用DECIMAL,禁止使用FLOAT和DOUBLE类型。FLOAT和DOUBLE在存储的时候,存在精度损失的问题,很可能在值的比较时,得到错误的结果。 使用datetime、timestamp类型来存储时间,禁止使用字符串替代。 使用数字类型INT UNSIGNED存储IP地址,用INETATON、INETNTOA可以在IP地址和数字类型之间转换。 VARCHAR类型的长度应该尽可能短。VARCHAR类型虽然在硬盘上是动态长度的,但是在内存中占用的空间是固定的最大长度。 使用VARBINARY存储大小写敏感的变长字符串,VARBINARY默认区分⼤小写,没有字符集概念,速度快。 数据库索引设计规范 每个InnoDB表强烈建议有一个主键,且不使用更新频繁的列作为主键,不使用多列主键。不使用UUID、MD5、字符串列作为主键。最好选择值的顺序是连续增长的列作为主键,所以建议选择使用自增ID列作为主键。 限制每张表上的索引数量,建议单张表索引不超过5个。索引并不是越多越好,索引可以提高查询的效率,但会降低写数据的效率。有时不恰当的索引还会降低查询的效率。 禁止给表中的每一列都建立单独的索引。设计良好的联合索引比每一列上的单独索引效率要高出很多。 建议在下面的列上建立索引: 1. 在SELECT,UPDATE,DELETE语句的WHERE从句上的列。 2. 在ORDER BY,GROUP BY,DISTINCT上的列。 3. 多表JOIN的关联列。 索引列顺序: 1. 区分度最高的放在联合索引的最左侧。区分度列中不同值的数量/列的总行数。 2. 尽量把字段长度小的列放在联合索引的最左侧。因为字段长度越小,一页能存储的数据量越大,IO性能也就越好。 3. 使用最频繁的列放到联合索引的左侧。这样可以比较少的建立一些索引。 避免冗余的索引,如:primary key(id),index(id),unique index(id) 避免重复的索引,如:index(a,b,c),index(a,b),index(a),重复的和冗余的索引会降低查询效率,因为RDS for MySQL查询优化器会不知道该使用哪个索引。 在VARCHAR字段上建立索引时,需指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。一般对字符串类型数据,长度为20的索引,区分度会高达90%以上,可以使用 count(distinct left(列名, 索引长度))/count() 的区分度来确定。 对于频繁查询优先考虑使用覆盖索引。覆盖索引指包含了所有查询字段的索引,不仅仅是WHERE从句GROUP BY从句中的列,也包含SELECT查询的列组合,避免InnoDB表进行索引的二次查询。 外键约束:建立外键关系的对应列的字符集必须保持一致或者存在外键关系的子表父表的字符集保持一致。