MySQL-27丨MySQL操作规范

Posted by jiefang on November 1, 2019

MySQL操作规范

命名规范

  • 表名建议使用有业务意义的英文词汇,必要时可加数字和下划线,并以英文字母开头;
  • 库、表、字段全部采用小写;
  • 避免用 MySQL 的保留字
  • 命名(包括表名、列名)禁止超过 30 个字符;
  • 临时库、表名必须以 tmp 为前缀,并以日期为后缀,如:tmp_shop_info_20190404;
  • 备份库、表必须以 bak 为前缀,并以日期为后缀,如:bak_shop_info_20190404;
  • 索引命名:
    • 非唯一索引必须按照“idx_字段名称”进行命名;
    • 唯一索引必须按照“uniq_字段名称”进行命名。

设计规范

  • 1、主键:
    • 表必须有主键;
    • 不使用更新频繁的列做主键;
    • 尽量不选择字符串列做主键;
    • 不使用 UUID MD5 HASH 做主键;
    • 默认使用非空的唯一键。
  • 2、如无特殊要求,建议都使用 InnoDB 引擎;
  • 3、默认使用 utf8mb4 字符集,数据排序规则使用 utf8mb4_general_ci;
  • 4、所有表、字段都需要增加 comment 来描述此表、字段所表示的含义;
  • 5、如无说明,表必须包含 create_time 和 update_time 字段,即表必须包含记录创建时间和修改时间的字段;
  • 6、用尽量少的存储空间来存数一个字段的数据:
    • a、能用 int 的就不用 char 或者 varchar;
    • b、能用 tinyint 的就不用 int;
    • c、使用 UNSIGNED 存储非负数值;
    • d、只存储年使用 YEAR 类型;
    • e、只存储日期使用 DATE 类型。
  • 7、存储精确浮点数必须使用 DECIMAL 替代 FLOAT 和 DOUBLE;
  • 8、尽可能不使用 TEXT、BLOB 类型;
  • 9、禁止在数据库中存储明文密码;
  • 10索引设计规范:
    • a、需要添加索引的字段
      • UPDATE、DELETE 语句的 WHERE 条件列;
      • ORDER BY、GROUP BY、DISTINCT 的字段
      • 多表 JOIN 的字段
    • b、单表索引建议控制在 5 个以内;
    • c、适当配置联合索引;
    • d、业务上具有唯一性的字段,添加成唯一索引;
    • e、在 varchar 字段上建立索引时,建议根据实际文本区分度指定索引长度;

      可以降低索引所占用的空间

    • f、索引禁忌:
      • 不在低基数列上建立索引,例如:性别字段。
      • 不在索引列进行数学运算和函数运算
  • 11、不建议使用外键;

    原因:外键会导致表与表之间耦合,update 与 delete 操作都会涉及相关联的表,十分影响 sql 的性能,甚至会造成死锁。高并发情况下容易造成数据库性能。

  • 12、禁止使用存储过程、视图、触发器、Event;

    原因:高并发的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性。

  • 13、单表列数目建议小于 30;

SQL语句规范

  • 避免隐式转换;
  • 尽量不使用select *,只 select 需要的字段 ;

    原因:读取不需要的列会增加 CPU、IO、NET 消耗,并且不能有效的利用覆盖索引。

  • 禁止使用 INSERT INTO t_xxx VALUES (xxx),必须显示指定插入的列属性 ;
  • 尽量不使用负向查询;

    比如 not in/like。

  • 禁止以 % 开头的模糊查询。
  • 禁止单条 SQL 语句同时更新多个表;
  • 统计记录数使用 select count(*),而不是 select count(primary_key)或者 select count(普通字段名);

    原因:可能会导致走的索引不是最优的或者导致统计数字不准确。

  • 建议将子查询转换为关联查询;
  • 建议应用程序捕获 SQL 异常,并有相应处理;
  • SQL 中不建议使用 sleep(),如特殊需求需要用到 sleep(),请提前告知 DBA;
  • 避免大表的 join。

行为规范

  • 批量导入、导出数据必须提前通知 DBA 协助观察;
  • 可能导致 MySQL QPS 上升的活动,提前告知DBA;
  • 同一张表的多个 alter 合成一次操作;
  • 不在业务高峰期批量更新、查询数据库;
  • 删除表或者库要求尽量先 rename,观察几天,确定对业务没影响,再 drop。