导读:mysql
关于MySQL数据库规范,相信你们多少看过一些文档。本篇文章给你们详细分类总结了数据库相关规范,从库表命名设计规范讲起,到索引设计规范,后面又给出SQL编写方面的建议。相信这些规范适用于大多数公司,也但愿你们都能按照规范来使用咱们的数据库,这样咱们的数据库才能发挥出更高的性能。sql
tmp_
为前缀,并以日期为后缀,备份库、表以 bak_
为前缀,并以日期为后缀。【强制】表和列的名称必须控制在32个字符之内,表名只能使用字母、数字和下划线,一概小写。数据库
【强制】表名要求模块名强相关,同一模块使用的表名尽可能使用统一前缀。缓存
【强制】建立表时必须显式指定字符集为utf8或utf8mb4。函数
【强制】列名尽可能不用关键字(如type,order等)。性能
【强制】建立表时必须显式指定表存储引擎类型,如无特殊需求,一概为InnoDB。网站
【强制】建表必须有comment。spa
【强制】对于超过100W行的大表进行alter table,必须通过DBA审核,并在业务低峰期执行,多个alter需整合在一块儿。 由于alter table会产生表锁,期间阻塞对于该表的全部写入,对于业务可能会产生极大影响。设计
【建议】建表时关于主键:表必须有主键 (1)强制要求主键为id,类型为int或bigint,且为auto_increment 建议使用unsigned无符号型。code
(2)标识表里每一行主体的字段不要设为主键,建议设为其余字段如user_id,order_id等,并创建unique key索引。 由于若是设为主键且主键值为随机插入,则会致使innodb内部page分裂和大量随机I/O,性能降低。
【建议】核心表(如用户表)必须有行数据的建立时间字段create_time和最后更新时间字段update_time,便于查问题。
【建议】表中全部字段尽可能都是NOT NULL属性,业务能够根据须要定义DEFAULT值。 由于使用NULL值会存在每一行都会占用额外存储空间、数据迁移容易出错、聚合函数计算结果误差等问题。
【建议】中间表用于保留中间结果集,名称必须以tmp_
开头。备份表用于备份或抓取源表快照,名称必须以bak_
开头。中间表和备份表按期清理。
【示范】一个较为规范的建表语句:
CREATE TABLE user_info (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`user_id` bigint(11) NOT NULL COMMENT '用户id',
`username` varchar(45) NOT NULL COMMENT '真实姓名',
`email` varchar(30) NOT NULL COMMENT '用户邮箱',
`nickname` varchar(45) NOT NULL COMMENT '昵称',
`birthday` date NOT NULL COMMENT '生日',
`sex` tinyint(4) DEFAULT '0' COMMENT '性别',
`short_introduce` varchar(150) DEFAULT NULL COMMENT '一句话介绍本身,最多50个汉字',
`user_resume` varchar(300) NOT NULL COMMENT '用户提交的简历存放地址',
`user_register_ip` int NOT NULL COMMENT '用户注册时的源ip',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`user_review_status` tinyint NOT NULL COMMENT '用户资料审核状态,1为经过,2为审核中,3为未经过,4为还未提交审核',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_user_id` (`user_id`),
KEY `idx_username`(`username`),
KEY `idx_create_time_status`(`create_time`,`user_review_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='网站用户基本信息'
复制代码
pk_
开头,惟一键以 uniq_
或 uk_
开头,普通索引以 idx_
开头,一概使用小写格式,以字段的名称或缩写做为后缀。