MySQL开发规范

377 阅读4分钟

表设计规范

  • 没有特殊要求(即Innodb无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用Innodb存储引擎 
  • 数据库字符集使用UTF8,校对字符集使用utf8_general_ci,如果有表情这种数据可以使用utf8mb4 
  • 所有表、字段都尽量添加注释 
  • 库名、表名、字段名使用小写字母,禁止超过32个字符,须见名知意 
  • 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 
  • 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 
  • 临时库表必须以tmp_为前缀并以日期为后缀,备份表必须以bak_为前缀并以日期(时间戳)为后缀 
  • 所有存储相同数据的列名和列类型必须一致(一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低) 
  • 用DECIMAL代替FLOAT和DOUBLE存储精确浮点数(精确数据) 
  • 使用TINYINT代替ENUM类型(便于迁移时兼容) 
  • 优先选择符合存储需要的最小的数据类型
  • 尽可能不使用TEXT、BLOB类型(该数据类型不能设置默认值、不便于排序、不便于建立索引) 
  • 同一意义的字段设计定义必须相同(便于联表查询) 
  • 所有字段均定义为NOT NULL(避免使用NULL字段,NULL字段很难查询优化,NULL字段的索引需要额外空间,NULL字段的复合索引无效) 
  • 表必须有主键,不使用更新频繁的列做主键、尽量不使用字符串列做主键,尽量使用非空的唯一自增键做主键 
  • 非唯一索引以 “idx_字段1_字段2” 命名,唯一索引必须以 “uniq_字段1_字段2” 命名
  • 当表的字段数非常多时,可以将表分成两张表,一张作为条件查询表,一张作为详细内容表 (主要是为了性能考虑)
  • 由于 MYSQL 表 DDL 维护成本很高,所以在适当的时候,可以有一定的字段容余。 比如:Value1,Value2,Value3 这样的字段
  • 建议一张表不要超过20个字段,数据控制在500万以内

索引设计规范

  • 单表索引数量不超过5个 
  • 单个字段不要超过两个索引 
  • 新建的唯一索引必须不能和主键重复 
  • 避免冗余和重复索引 
  • 尽量不要在频繁更新的列上建立索引 不在低基数列上建立索引,例如性别、类型等 
  • 不在索引列进行数学运算和函数运算(参与了运算的列不会引用索引) 
  • 复合索引须符合最左前缀的特点建立索引(mysql使用复合索引时从左向右匹配) 
  • 重要的SQL中where条件里的字段必须被索引 
  • Where条件里的字段顺序与索引顺序无关,优化器会自动调整 
  • 尽量使用覆盖索引,防止回表查询 
  • 数据量少的表,不建议建索引 
  • 以%开头的like查询不能使用索引,like '%XX'或者like '%XX%'不能使用到索引 
  • 数据类型出现隐式转换的不能使用索引。数据INT类型,而用varchar查询(select * from user where age=12 比如age是字符串类型,这条语句索引就失效了,应该是age='12') 
  • 用or分隔开的条件,如果or前的列中有索引,而后边的列中没有索引,不会使用索引。(or的所有条件必须全部使用索引字段才会走索引 
  • !=,<>,is null,is not null 都会导致索引失效 
  • 建立索引时,务必先explain,查看索引使用情况

sql语句规范

  • SQL语句尽可能简单,大的SQL想办法拆分成小的SQL实现 
  • 不要使用SELECT * ,查询具体要用到的字段 
  • 能确定返回结果只有一条时,使用limit 1(LIMIT分页注意效率,LIMIT越大,效率越低) 
  • 少用子查询,改用JOIN(子查询要在内存里建临时表) 
  • 多表JOIN的字段,区分度最大的字段放在前面 
  • IN条件里的数据数量要尽量少,超过200个用EXIST代替IN 
  • Where字句中同一个表的不同字段组合建议小于5组(否则考虑分表) 
  • 禁止单条语句同时更新多个表 
  • 事务要尽量简单,整个事务的时间长度不要太长
  • 拆分大的 delete 或 insert,update 语句
  • OR 改写成 IN:OR 的效率是 n 级别,IN 的效率是 log (n) 级别
  • 对于连续数值,使用 BETWEEN 不用 IN
  • 少用 JOIN,大表联查会通过笛卡尔积生成大的临时表