Neo Anderson's Blog

Mysql 设计规范总结

字数统计: 867阅读时长: 3 min
2018/05/10

一, 库表命名规范

  • 库名必须有固定的命名长度,12个字符以内 , 表名、字段名20个字符以内,需见名知意
  • 表名字段名使用单数的英文单词,多个单词使用 _ 符号连接
  • 库名、表名、字段名禁使用MySQL保留字
  • 临时库、表名必须以tmp为前缀,并以日期为后缀

二, 库、表、字段开发设计规范

  • 原则上禁用分区表
  • 拆分大字段和访问频率低的字段,分离冷热数据
  • 按日期时间分表需符合YYYY[MM][DD][HH]格式
  • 尽可能不使用TEXT、BLOB类型,尽量使用varchar类型,实在避免不了,请拆表
  • 用DECIMAL代替FLOAT和DOUBLE存储精确浮点数
  • 原则上所有字段均定义为NOT NULL,默认值,整型为0、字符串为空字符’’ ,字段需要建索引的必须用NOT NULL NULL字段很难查询优化
  • 大表使用bigint unsigned 作为自增列
  • 尽量使用timestamp存储时间
  • 能用int尽量不用varchar
  • 大表禁止使用ENUM,ENUM字段加类型是DDL操作
  • 尽量使用varchar存储字符串。VARCHAR(M),M尽可能小,因为VARCHAR按实际的字符数申请内存时,如果大于255个,需要2bytes,小于 等于255个,需要1bytes。M表示字符数而不是字节数,比如VARCHAR(1024),最大可存储1024个汉字,根据实际业务选择长度M

三, 索引规范

  • 索引的数量要控制:

    • 单张表中索引数量不超过8个
    • 单个索引中的字段数不超过4个
    • 对字符串优先考虑使用前缀索引,前缀索引长度不超过15个字符
  • 主键准则

    • 表必须有主键
    • 不使用更新频繁的列作为主键
    • 尽量不选择字符串列作为主键
    • 不使用UUID MD5 HASH这些作为主键(数值太离散了)
    • 默认使非空的唯一键作为主键
    • 建议选择自增或发号器
  • 重要的SQL必须被索引,比如:

    • UPDATE、DELETE语句的WHERE条件列
    • ORDER BY、GROUP BY、DISTINCT的字段
  • 多表JOIN的字段注意以下:

    • 区分度最大的字段放在前面
    • 优先考虑覆盖索引
    • 避免冗余和重复索引
    • 索引要综合评估数据的选择性以及考虑查询和更新比例
  • 索引禁忌

    • 不在低基数列上建立索引,例如“性别”
    • 不在索引列进行数学运算和函数运算
  • 不使用外键

    • 外键用来保护参照完整性,可在业务端实现
    • 对父表和子表的操作会相互影响,降低可用性
    • 增加锁冲突的概率
    • 增加写入和更新的延迟
  • 索引命名:非唯一索引必须以 idx_字段1_字段2命名,唯一所以必须以uniq_字段1_字段2命名,索引名称必须全部小写

  • 索引字段的默认值不能为NULL,要改为其他的default或者空。NULL非常影响索引的查询效率

  • 反复查看与表相关的SQL,符合最左前缀的特点建立索引。多条字段重复的语句,要修改语句条件字段的顺序,为其建立一条联合索引,减少 索引数量

  • 研发要经常使用explain,如果发现索引选择性差,必须学会使用hint(后续在总结了….)

CATALOG
  1. 1. 一, 库表命名规范
  2. 2. 二, 库、表、字段开发设计规范
  3. 3. 三, 索引规范