一 . 基础规范

1.必须使用InnoDB存储引擎

解读:支持事务;支持行级锁;支持MVCC多版本控制;支持外键;死锁自动检测;并发性能更好、CPU及内存缓存页优化使得资源利用率更高。

2.  表字符集推荐使用utf8mb4

解读:utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8字符,也就是 Unicode 中的基本多文本平面(BMP)。任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集,utf8mb4是utf8的超集,有存储4字节例如表情符号时,使用它。

3.  数据表、数据字段必须加入中文注释

解读:方便大家对表的理解,方便DBA和开发的沟通,方便历史传承。

4.  禁止使用存储过程、视图、触发器、Event

解读:A.对数据库性能影响较大,互联网业务,能让站点层和服务层干的事情,不要交到数据库层,数据库擅长存储和索引。

B.调试,排错,迁移都比较困难,扩展性较差。

5.  禁止存储大文件或者大照片

解读:建议存储到专门的类型数据库中。

6.MySQL 服务配置时,明确server_id

In MySQL 5.7, a server ID had to be specified when binary logging was enabled, or the server would not start. In MySQL 8.0, the server_id system variable is set to 1 by default. The server can be started with this default ID when binary logging is enabled, but an informational message is issued if you do not specify a server ID explicitly using the --server-id option. For servers that are used in a replication topology, you must specify a unique nonzero server ID for each server.

二 . 命名规范

1.  库名,表名,列名必须用小写,采用下划线分隔

解读:A.数据库服务器端开了大小写敏感,提高数据库服务器性能

B.只有一套标准,避免Abc,ABC混淆(SQL)

2.  库名,表名,列名必须见名知义,长度不要超过32字符

解读:见名知义,便于理解;长度不要过长,便于书写。

三 . 表设计规范

1.  表必须有主键,推荐使用bigint,表数据量少也可使用unsigned int为主键

解读:删除无主键的表,如果是row模式的主从架构,从库会挂住

2.  主从表可使用自增bigint做主键,冗余无业务含义的字段做关联字段,并做非聚集索引

解读:A.如order表自增主键id,冗余order_no字段,order_detail表自增主键id,冗余order_no字段;order\order_detail和通过order_no关联,并对order_no做非聚集索引

B.可有效减少数据文件和索引文件提示查询性能

3.  禁止使用外键,如果要保证完整性,应由应用程式实现

解读:外键使得表之间相互耦合,影响update/delete等SQL性能,有可能造成死锁,高并发情况下容易成为数据库瓶颈点

4.  建议将大字段,访问频度低的字段拆分到单独的表中存储,分离冷热数据

解读:会显著提升该表的查询性能

5.  表必须有字段create_by、create_time、modify_by、modify_time、disabled

解读:便于表的维护。

四 . 列设计规范

1. 根据业务区分使用tinyint/int/bigint,分别会占用1/4/8字

解读:数据量大时,表字段的类型会显著影响性能

2. 根据业务区分使用char/varchar

解读:A.字段长度固定,或者长度近似的业务场景,适合使用char,能够减少碎片,查询性能高

B.字段长度相差较大,或者更新较少的业务场景,适合使用varchar,能够减少空间

3. 根据业务区分使用datetime(3)/timestamp(3)

解读:A.前者占用8个字节,后者占用4个字节,存储年使用YEAR,存储日期使用DATE,存储时间使用datetime(3)

B.如果需要根据时区显示对应时区的时间,使用timestamp

C.Datetime(3)/timestamp(3)保存到毫秒级别,程序端select now(3)

4. 必须把字段定义为NOT NULL并设默认值

解读:A.NULL的列使用索引,索引统计,值都更加复杂,MySQL更难优化

B.NULL需要更多的存储空间

C.NULL只能采用IS NULL或者IS NOT NULL,不可使用=/!=/in/not in

5.     使用varchar(20)存储手机号,不要使用整数

解读:A.牵扯到国家代号,可能出现+/-/()等字符,例如+86

B.手机号不会用来做数学运算

C.varchar可以模糊查询,例如like ‘138%’

6.  使用TINYINT来代替ENUM

解读:ENUM增加新值要进行DDL操作

五 . 索引规范

1. 非聚集索引使用idx_[字段名]来命名

2. 单张表索引数量建议控制在5个以内

解读:A.互联网高并发业务,太多索引会影响写性能

B.生成执行计划时,如果索引太多,会降低性能,并可能导致MySQL选择不到最优索引

C.异常复杂的查询需求,可以选择其他等更为适合的方式存储

3. 尽量避免\禁止使用唯一索引

解读:只是比非聚集索引快一个CPU查找的时间,但在delete,update时都要重新排序

4. 组合索引字段数不建议超过3

解读:如果3个字段还不能极大缩小row范围,很可能是设计有问题

5. 不建议在频繁更新的字段上建立索引

6. 非必要不要进行JOIN查询,如果要进行JOIN查询,被JOIN的字段必须类型相同,并建立索引

解读: JOIN字段类型不一致,会导致全表扫描。

7. 理解组合索引最左前缀原则,避免重复建设索引,如果建立了(a,b,c),相当于建立了(a), (a,b), (a,b,c) 

六 . SQL语句规范

1.  禁止使用select *,只获取必要字段

解读:A.select *会增加cpu/io/内存/带宽的消耗

B.指定字段能有效利用索引覆盖

C.指定字段查询,在表结构变更时,能保证对应用程序无影响

2.  insert必须指定字段,禁止使用insert into T values()

解读:指定字段插入,在表结构变更时,能保证对应用程序无影响

3.  隐式类型转换会使索引失效,导致全表扫描

解读:一定要确保声明的类型和索引字段类型一致

4.  禁止在where条件列使用函数或者表达式

解读:导致不能命中索引,全表扫描

5. 禁止%开头的模糊查询

解读:导致不能命中索引,全表扫描

6.  尽可能不使用大表JOIN和子查询

解读:会占用大量的内存、IO、CPU,如果使用到要先缩小结果集在做join(超过1000万的表都应该考虑缩小结果集在做join)

7.  区分INNER\LEFT\RIGHT\FULL JOIN,合理使用,JOIN尽量不超过3个表

解读:MySQL查询优化器很烂,可在测试环境构造不同的写法,查看对应的执行计划,得出最佳的方案,可使用测试环境最佳实践

8. 同一个字段上的OR必须改写为ININ的值必须少于50

9. 应用程序必须捕获SQL异常

解读:方便定位线上问题

MySQL日常使用遵循的规范建议的更多相关文章

  1. MySQL日常应用和操作记录

    整理MySQL日常操作. 1.知道一个字段名,怎样查到它在数据库里的哪张表里? USE Information_schema;SELECT TABLE_NAME FROM COLUMNS WHERE ...

  2. CheckStyle, 强制你遵循编码规范

    如今代码静态检查越来越重要,已经成为构建高质量软件的不可或缺的一个验证步骤.如果你使用的是java语言,那么CheckStyle则是一个利器. CheckStyle能够帮助程序员检查代码是否符合制定的 ...

  3. WindowsclientC/C++编程规范“建议”——前言

    前言 工作中接触了非常多编程规范.当中最有意思的是,公司近期公布了一版C/C++编程规范,然后我看到该规范的最后一段时,有这么一句:"该规范不适用于Windows平台开发".看来这 ...

  4. RESTful规范建议

    RESTful概述 RESTful是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越多网站的采用. REST是Representational State T ...

  5. 【转】Android编码规范建议18条

    转自:http://www.chinaz.com/design/2015/0908/443732.shtml Android编码规范建议18条 适合手机app设计师和android 工程师阅读. 1. ...

  6. Mysql数据库的瓶颈处理一点建议

    Mysql数据库的瓶颈处理一点建议         我们在使用Mysql数据库是常见的两个瓶颈是CPU和I/O的瓶颈,CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候.磁盘I/O瓶颈的出 ...

  7. Mysql 日常

    Mysql 日常总结 做报表的时候经常会使用 if 来帮助统计 select count(if(key=1,1,NULL)) from atable where ... 当然,也支持选择 select ...

  8. 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知

    面试官: 我看你的简历上写着精通MySQL,问你个简单的问题,MySQL联合索引有什么特性? 心想,这还不简单,这不是问到我手心里了吗? 听我给你背一遍八股文! 我: MySQL联合索引遵循最左前缀匹 ...

  9. MySQL优化之推荐使用规范

    一.基础规范 使用InnoDB存储引擎支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 推荐使用utf8mb4字符集无需转码,无乱码风险, 支持emoji表情以及部分不常见汉字 ...

随机推荐

  1. Data Management Technology(2) -- Data Model

    1.Data Model Model Is the abstraction of real world Reveal the essence of objects, help people to lo ...

  2. SQL Server查询数据库表字段类型

    select b.name,a.name,c.name,a.xprec,a.xscalefrom  syscolumns aleft outer join sysobjects b ON a.id=b ...

  3. SQL高效运行注意事项(四)

    为了SQLSERVER能高效运行,SQLSERVER的磁盘子系统是一个重要的方面 Avg. Disk Sec/Read 这个计数器是指每秒从磁盘读取数据的平均值 下面的列表显示这个计数器值的范围,并指 ...

  4. I2C协议学习笔记

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/wzt_007/article/detai ...

  5. Codeforces Round #603 (Div. 2)

    传送门 感觉脑子还是转得太慢了QAQ,一些问题老是想得很慢... A. Sweet Problem 签到. Code /* * Author: heyuhhh * Created Time: 2019 ...

  6. request请求参数与http请求过程

    request请求参数

  7. spring+eureka+zuul

    最近在看一个关于spring+eureka+zuul的教学视频,终于明白了eureka是用于提供服务注册和发现的service,通过eureka各个service可以知道其他service,这样就隔离 ...

  8. python Qt5 实战(一)按钮颜色

    工作中,工具用到了python Qt5,涉及到了按钮颜色,这里就做个总结.也顺便给要用这块的同仁抛出来一个砖头,把大牛引出来做个指导. 一般设置按钮的颜色有三种表达:如下所示:具体的怎么使用,估计要看 ...

  9. IT兄弟连 Java语法教程 数组 数组的使用

    数组最常用的用法就是访问数组元素,包括对数组元素进行赋值和取出数组元素的值.访问数组元素都是通过在数组引用变量后紧跟一个方括号([]),方括号里是数组元素的索引值,这样就可以访问数组元素了.访问到数组 ...

  10. WPF 使用SetParent嵌套窗口

    有点类似与Winform的MDI窗口. 使用函数为SetParent和MoveWindow(经常配合). [DllImport("user32.dll", SetLastError ...