当前位置:首页 > 其他 > 值得收藏的一份MySQL规范

值得收藏的一份MySQL规范

转载自:cnblogs 2019-10-29 其他 1023
分享给朋友:

本文档是为帮助研发与运维人员按照规范使用MySQL数据库,提升研发写SQL的水平。致力于提供一个安全,稳定,高性能的数据库环境。

命名规范

1) 库名、表名、字段名必须使用小写字母,"_"分割。
2) 库名、表名、字段名不超过12个字符。
3) 库名、表名、字段名禁止使用MySQL保留字,见附件。
4) 库名、表名、字段名见名知意,建议使用名词而不是动词。
5) 数据对象、变量的命名都采用英文字符,禁止使用中文命名。
6) 临时库、表名必须以tmp为前缀,并以日期为后缀。
7) 备份库、表必须以bak为前缀,并以日期为后缀。

基础规范

1) 所有表统一使用InnoDB存储引擎。
2) 表字符集选择UTF8mb4。
3) 所有表和列都需要添加注释。
4) 禁止在数据库中存储图片、文件。
5) 禁止在线上做数据库压力测试,如有特殊需要,需提前报备。
6) 禁止客户端直接操作测试,生产数据库。
7) 研发保证应用与数据库表结构版本的统一,并提供相应的数据库回滚策略。
8) 表结构变更DBA审核未通过的,不允许上线。

字段设计规范

1) 每张表必须有整型主键。如:id bigint(20) UNSIGNED , NOT NULL,不要自增。
2) 禁止DEFAULT NULL,建议NOT NULL 设置默认值。
3) 存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE,或者使用bigint(需要做转换)。
4) 建议使用UNSIGNED存储非负数值。
5) 不建议使用ENUM类型,使用TINYINT来代替。
6) 建议使用INT UNSIGNED存储IPV4。
7) 禁止在数据库中存储明文密码。
8) 整形定义中建议采用INT(10),而不是INT(1),INT(11)或其他。
9) 存储状态,性别等,用TINYINT。
10) 将过大字段拆分到其他表中。尽可能不使用TEXT、BLOB类型。如果必须使用,业务表中的TEXT,BLOB中字段,必须要拆分到单独的表中存储。
11) 需要根据实际的宽度来选择VARCHAR(N)类型的宽度。
12) N表示的是字符数不是字节数. VARCHAR(N),N尽可能小,进行排序和创建临时表一类的内存操作时,会使用N的长度申请内存。
13) 存储年使用YEAR类型,存储日期使用DATE类型。 
14) 13 存储时间(精确到秒)建议使用TIMESTAMP类型,因为TIMESTAMP使用4字节,DATETIME使用8个字节。TIMESTAMP类型保存的值不能比1970早或比2037晚。

一句话总结:

能NOT NULL 就NOT NULL,char、varchar用NOT NULL DEFAULT '',tinyint、smallint、int用NOT NULL DEFAULT 0。
char、varchar取值要吝啬,根据实际需求给,比如人名一般不超过5个,varchar(5),不要varchar(200)。int、tinyint这类,int(1)和int(13)都是一样的,
我们统一用int(10),tinyint取值范围[-128,127],加了unsigned取值[0,255],如果不需要存储负数,整型类型的加unsigned。

索引规范

1) 单张表的索引数量控制在5个以内。
2) 复合索引中的字段数建议不超过5个。
3) 非唯一索引必须按照"idx_字段名称_字段名称[_字段名]"进行命名。
4) 唯一索引必须按照"uniq_字段名称_字段名称[_字段名]"进行命名。
5) 合理利用覆盖索引。不使用更新频繁的列做为索引。
6) 对长字符串考虑使用前缀索引,前缀索引长度不超过8个字符。
7) 索引字段的顺序需要考虑字段值去重之后的个数,个数多的放在前面。
8) 使用EXPLAIN判断SQL语句是否合理使用索引,尽量避免extra列出现:Using File Sort,UsingTemporary。
9) UPDATE、DELETE语句需要根据WHERE条件添加索引。
10) 合理创建联合索引(避免冗余),(a,b,c) 相当于 (a) 、(a,b) 、(a,b,c),但(a,c)只能用到部分索引。

索引禁忌

1) 不在选择性低的列上建立索引,例如"性别", "状态", "类型"。
2) 不在索引列进行数学运算和函数运算。
3) 尽量不使用外键。
4) 高并发场景不建议使用唯一索引。
5) 不使用前导查询,如like "%ab",like "%ab%"。
6 SQL语句规范
1) SQL语句中IN包含的值不应过多(不超过1000个)
2) UPDATE、DELETE语句不使用LIMIT。
3) WHERE条件中必须使用合适的类型,避免MySQL进行隐式类型转化。
4) SELECT语句只获取需要的字段。
5) SELECT、INSERT语句必须显式的指明字段名称,不使用SELECT *,不使用INSERT INTO table()。
6) WHERE条件中的非等值条件(IN、BETWEEN、<、<=、>、>=)会导致后面的条件使用不了索引。
7) 避免在SQL语句进行数学运算或者函数运算,容易将业务逻辑和DB耦合在一起。
8) INSERT语句使用batch提交(INSERT INTO table VALUES(),(),()……),values的个数不应过多。
9) 避免使用存储过程、触发器、函数等,容易将业务逻辑和DB耦合在一起,并且MySQL的存储过程、触发器、函数中存在一定的bug。
10) 避免使用JOIN。
11) 使用合理的SQL语句减少与数据库的交互次数。
12) 不使用ORDER BY RAND(),使用其他方法替换。
13) 建议使用合理的分页方式以提高分页的效率。
14) 统计表中记录数时使用COUNT(*),而不是COUNT(primary_key)和COUNT(1)。

分享给朋友:

相关文章

gocron数据库表和字段字符集转换为utf8mb4

gocron_sql_convert_to_utf8mb4因为 gocron - 定时任务管理系统 默认表和字段字符集是utf8(也就是utf8mb3),所以在现下很多数据存储会有问题,最为突出的就是emoji表情写了一个简单的转换sql:git地址 有用到的小伙伴可以拿去直接转换

为集群搭建一个定时任务集中调度系统

集群任务下,很多服务器的定时任务都单独集中在相对应的服务器crontab下,即使现在有了类似于宝塔之类的面板,但是定时任务还是得每台服务器单独登入后去配置。是否可以单独在一台机子上,控制所有的集群定时任务呢?答案是肯定的!!!gocron就可以做到,之前博主分享过单机搭建定时任务管理系统,那现在,我

Linux 日志清理

磁盘占用90%,占用过多,分析日志查看原因

如何在Linux上做一个定时任务管理系统

gocron,使用Go语言开发的轻量级定时任务集中调度和管理系统, 用于替代Linux-crontab

Nginx 自动生成日志备份

Nginx网站访问日志数据会随着访问量的增加而日益庞大,以下介绍一个简单的脚本,自动切割备份过往日期日志数据

3月18日,多年的老站终于破了1.5W的PV

从最早的建站初心是为了自己方便,从fivefilm.com到30942.com,有网友说域名不好记,索性注册了看个蛋(kangedan.com)的域名。6年多的时间(我也是随性等得起)0推广,纯自然流量!今天看了下PV记录,有点被吓到!特别纪念一下,之前都是几千IP,封顶也没超过1.5W。

如果你懂得用Excel,微软Power Fx助你成为一名优秀的程序员

在程序员的世界中,打开第一扇门永远是Hello World!这是Power Fx的一段最基础的语法。微软宣布推出新的开源编程语言 Power Fx,一种基于 Microsoft Excel 的低代码公式语言;将可以在整个 Microsoft Power Platform 中进行使用。该语言背后的动机

微软推出Go语言从入门到上手的文档

微软有自己的技术文档专栏网站,可能很多小伙伴都不知道!除了自己的.NET语言,还包括了市面上绝大多数流行语言的技术文档都有。这次,微软把Go语言也加入到了自家技术文档网站中,而且绝大多数文档都是有中文版本的!点击直接访问:更多文档访问以下地址:https://docs.microsoft.com/z

Deno初体验:一个简单的MVC案例

Deno 是一个 JavaScript/TypeScript 的运行时,默认使用安全环境执行代码,有着卓越的开发体验。Deno 含有以下功能亮点:

【年度重磅】阿里淘系全年技术总结黑皮书,1500页免费下载!

淘系技术将2020一整年的精华内容梳理合并,重磅推出【淘系技术2020技术年货】。在这本书中,你将看到:各技术栈下时新前沿的技术讲解与方法技巧、淘系技术大牛的职场成长经验&学习问答实录、年度精选技术人员必读书单、淘系经典开源项目介绍、2020淘系顶会 paper 全文。