一 . 基础规范

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. JavaScript 赋值

    JavaScript 赋值运算符 赋值运算符向 JavaScript 变量赋值. 运算符 例子 等同于 = x = y x = y += x += y x = x + y -= x -= y x = ...

  2. Locust压测结果准确性验证

    最近闲着没事做,就重新研究了一下基于python语言的Locust性能测试框架 发现在压测的过程中,虽然设置了100并发,但是通过实际监控,完全看不到100并发压测的效果 通过代码AOP日志监控接口的 ...

  3. linux下unzip解压报错“symlink error: File name too long”怎么办?提供解决方案。

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 分享unzip工具的一个bug." 最近在研究菠菜站,中间用到了Spidermonkey,碰到一些小波折,在这里分享出来,以便大家 ...

  4. OpenCV:增加和减少图像的亮度,图像的加减法

    首先导包: import numpy as np import cv2 import matplotlib.pyplot as plt def show(image): plt.imshow(imag ...

  5. 服务器返回的数据将Unicode码转成汉字

    当我们请求接口的时候,服务器会返回一些数据,当我们打印的时候就会发现,打印出来的是unicode码,不是汉字. 这时候需要我们自己手动处理一下,让打印的时候输出汉字的格式. 方法如下: 新增一个分类, ...

  6. 打包Python文件为exe

    pip install pyinstaller 然后就在终端里执行命令 cd 到目标文件的目录下 执行 pyinstaller  -F  ***.py 即可生成exe

  7. Linux:FTP服务器的搭建

    FTP服务器的简介 系统用户 即系统本机的用户.Linux一般不会针对实体用户进行限制,因此实体用户可以针对整个文件 系统进行工作.但通常不希望他们通过FTP方式远程访问系统. 虚拟用户 只能采用FT ...

  8. 【使用篇二】SpringBoot使用JdbcTemplate操作数据库(12)

    Spring对数据库的操作在jdbc上面做了深层次的封装,提供了JdbcTemplate模板. 在SpringBoot使用JdbcTemplate很简单: 引入数据库驱动包(mysql或oracle) ...

  9. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) C. Messy 构造

    C. Messy You are fed up with your messy room, so you decided to clean it up. Your room is a bracket ...

  10. vs2010,vs2013,vs2015,vs2017, vs2019激活秘钥

    vs2010============================================== YCFHQ9DWCYDKV88T2TMHG7BHP vs2013=============== ...