必看的数据库使用规范

  

<>强导读:
关于MySQL数据库规范,相信大家多少看过一些文档。本篇文章给大家详细分类总结了数据库相关规范,从库表命名设计规范讲起,到索引设计规范,后面又给出SQL编写方面的建议。相信这些规范适用于大多数公司,也希望大家都能按照规范来使用我们的数据库,这样我们的数据库才能发挥出更高的性能。

  
关于库:
  
      <李>【强制】库的名称必须控制在32个字符以内,英文一律小写。   <李>【强制】库的名称格式:业务系统名称_子系统名。   <李>【强制】库名只能使用英文字母,数字,下划线,并以英文字母开头。   <李>【强制】创建数据库时必须显式指定字符集,并且字符集只能是utf8或者utf8mb4。创建数据库SQL举例:创建数据库db1默认字符集utf8,李   <李>【建议】临时库、表名以<代码> tmp_> bak_>   
  
关于表
  
      <李>【强制】表和列的名称必须控制在32个字符以内,表名只能使用字母,数字和下划线,一律小写。   <李>【强制】表名要求模块名强相关,同一模块使用的表名尽量使用统一前缀。   <李>【强制】创建表时必须显式指定字符集为utf8或utf8mb4。   <李>【强制】列名尽量不用关键字(如类型、订单等)。   <李>【强制】创建表时必须显式指定表存储引擎类型,如无特殊需求,一律为InnoDB。   <李>【强制】建表必须有评论。   <李>【强制】对于超过100 w行的大表进行alter table,必须经过DBA审核,并在业务低峰期执行,多个改变需整合在一起。
    因为alter table会产生表锁,期间阻塞对于该表的所有写入,对于业务可能会产生极大影响。   <李>   

    【建议】建表时关于主键:表必须有主键
    (1)强制要求主键为id、类型为int或bigint,且为auto_increment建议使用无符号无符号型。

      

    (2)标识表里每一行主体的字段不要设为主键,建议设为其他字段如user_id, order_id等,并建立唯一键索引。
    因为如果设为主键且主键值为随机插入,则会导致innodb内部页面分裂和大量随机I/O,性能下降。

      李   <李>【建议】核心表(如用户表)必须有行数据的创建时间字段create_time和最后更新时间字段update_time,便于查问题。   <李>【建议】表中所有字段尽量都是NOT NULL属性,业务可以根据需要定义默认值。
    因为使用NULL值会存在每一行都会占用额外存储空间,数据迁移容易出错,聚合函数计算结果偏差等问题。   <李>【建议】中间表用于保留中间结果集,名称必须以<代码> tmp_ 开头。备份表用于备份或抓取源表快照,名称必须以<代码> bak_ 开头。中间表和备份表定期清理。   <李>   

    【示范】一个较为规范的建表语句:

      
     <代码类=" language-mysql ">创建表user_info (
      “id”int unsigned NOT NULL AUTO_INCREMENT评论“自增主键的,
      user_id bigint (11) NOT NULL评论的用户身份证”,
      “用户名”varchar (45) NOT NULL评论的真实姓名”,
      “电子邮件”varchar (30) NOT NULL评论的用户邮箱”,
      “昵称”varchar (45) NOT NULL评论“昵称”,
      “生日”日期不是零评论“生日”,
      “性”非常小的整数(4)默认“0”评论“性”别,
      short_introduce的varchar(150)默认空评论“一句话介绍自己,最多50个汉字”,
      ‘user_resume varchar (300) NOT NULL评论的用户提交的简历存放地址”,
      “user_register_ip“int NOT NULL评论”用户注册时的源ip的,
      “create_time”默认时间戳NOT NULL CURRENT_TIMESTAMP评论“创建时间”,
      “update_time”时间戳NOT NULL违约CURRENT_TIMESTAMP alt="必看的数据库使用规范"> 
      

必看的数据库使用规范