一、基础规范

第一条:必须使用InnoDB存储引擎

解读:支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高

第二条:必须使用utf8(utf8mb4)字符集

解读:万国码,无需转码,无乱码风险,节省空间,utf8mb4是utf8的超集,由于近年移动设备的增多,emoji表情以及部分不常见汉字在utf8下会表现为乱码,故需要升级至utf8mb4

第三条:数据表、数据字段必须加入中文注释

解读:N年后谁会知道这个a1,a2,a3字段是干嘛的

第四条:禁止使用存储过程、视图、触发器、Event

解读:高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”。数据库擅长存储与索引,CPU计算还是上移吧

第五条:禁止存储大文件或者大照片

解读:为何要让数据库做它不擅长的事情?大文件和照片存储在文件系统,数据库里存URI多好

二、命名规范

第一条:只允许使用内网域名,而不是ip连接数据库

解读:虽然IP访问更快,域名访问需要内网dns,但是对于大数据库的扩展和迁库考虑,域名更好

第二条:线上环境、开发环境、测试环境数据库内网域名遵循命名规范

业务名称:xxx
线上环境:dj.xxx.db
开发环境:dj.xxx.rdb
测试环境:dj.xxx.tdb
从库在名称后加-s标识,备库在名称后加-ss标识
线上从库:dj.xxx-s.db
线上备库:dj.xxx-sss.db

第三条:库名、表名、字段名:小写,下划线风格,不超过32个字符,禁止拼音英文混用

解读:见名知意,方便后续维护

第四条:表名t_xxx,非唯一索引名idx_xxx,唯一索引名uniq_xxx

解读:见名知意,方便后续维护

三、表和字段设计规范

第一条:禁止使用外键,如果有外键完整性约束,需要应用程序控制

解读:外键会导致表与表之间耦合,update与delete操作都会涉及相关联的表,十分影响sql的性能,甚至会造成死锁。高并发情况下容易造成数据库性能,大数据高并发业务场景数据库使用以性能优先

第二条:必须把字段定义为NOT NULL并且提供默认值

解读:
a) null的列使索引/索引统计/值比较都更加复杂,对MySQL来说更难优化
b) null这种类型MySQL内部需要进行特殊处理,增加数据库处理记录的复杂性;同等条件下,表中有较多空字段的时候,数据库的处理性能会降低很多
c) null值需要更多的存储空,无论是表还是索引中每行中的null的列都需要额外的空间来标识
d) 对null的处理时候,只能采用is null或is not null,而不能采用=、in、<、<>、!=、not in这些操作符号。如:where name!='shenjian',如果存在name为null值的记录,查询结果就不会包含name为null值的记录

第三条:禁止使用TEXT、BLOB类型

解读:会浪费更多的磁盘和内存空间,非必要的大量的大字段查询会淘汰掉热数据,导致内存命中率急剧降低,影响数据库性能

第四条:禁止使用小数存储国币

解读:曾经踩过这样的坑,100元分3天摊销,每天摊销(100/3)元,结果得到3个33.33。后来实施对账系统,始终有几分钱对不齐,郁闷了很久(不是几分钱的事,是业务方质疑的眼神让研发很不爽),最后发现是除法惹的祸
解决方案:使用“分”作为单位,这样数据库里就是整数了

第五条:必须使用varchar(20)存储手机号

解读:
a) 涉及到区号或者国家代号,可能出现+-()
b) 手机号会去做数学运算么?
c) varchar可以支持模糊查询,例如:like“138%”

第六条:禁止使用ENUM,可使用TINYINT代替

解读:
a) 增加新的ENUM值要做DDL操作
b) ENUM的内部实际存储就是整数,你以为自己定义的是字符串?

第七条:表必须有主键,例如自增主键

解读:
a) 主键递增,数据行写入可以提高插入性能,可以避免page分裂,减少表碎片提升空间和内存的使用
b) 主键要选择较短的数据类型, Innodb引擎普通索引都会保存主键的值,较短的数据类型可以有效的减少索引的磁盘空间,提高索引的缓存效率
c) 无主键的表删除,在row模式的主从架构,会导致备库夯住

四、索引设计规范

第一条:单表索引建议控制在5个以内

解读:一个好的索引设计,可以让你的效率提高几十甚至几百倍,但过多反而适得其反

第二条:单索引字段数不允许超过5个

解读:字段超过5个时,实际已经起不到有效过滤数据的作用了

第三条:禁止在更新十分频繁、区分度不高的属性上建立索引

解读:
a) 更新会变更B+树,更新频繁的字段建立索引会大大降低数据库性能
b) "性别"这种区分度不大的属性,建立索引是没有什么意义的,不能有效过滤数据,性能与全表扫描类似

第四条:建立组合索引,必须把区分度高的字段放在前面

解读:能够更加有效的过滤数据

五、SQL使用规范

第一条:禁止使用SELECT *,只获取必要的字段,需要显示说明列属性

解读:
a) 读取不需要的列会增加CPU、IO、NET消耗
b) 不能有效的利用覆盖索引
c) 使用SELECT *容易在增加或者删除字段后出现程序BUG

第二条:禁止使用INSERT INTO t_xxx VALUES(xxx),必须显示指定插入的列属性

解读:容易在增加或者删除字段后出现程序BUG

第三条:禁止使用属性隐式转换

解读:SELECT uid FROM t_user WHERE phone=13812345678 会导致全表扫描,而不能命中phone索引,猜猜为什么?
int数据类型优先级高于archer, 该查询会把phone转换为int,因此需要把表中所有数据改成int,所以必须全盘扫描
phone是varchar类型,SQL语句带入的是整形,故不会命中索引,加个引号就好了:
SELECT uid FROM t_user WHERE phone='13812345678'

第四条:禁止在WHERE条件的属性上使用函数或者表达式

解读:SELECT uid FROM t_user WHERE from_unixtime(day)>='2017-02-15' 会导致全表扫描
正确的写法是:SELECT uid FROM t_user WHERE day>= unix_timestamp('2017-02-15 00:00:00')

第五条:禁止大表使用JOIN查询,禁止大表使用子查询

解读:会产生临时表,消耗较多内存与CPU,极大影响数据库性能,大表指的是数据量在1000万以上的表

第六条:禁止使用OR条件,必须改为IN查询

解读:旧版本Mysql的OR查询是不能命中索引的,即使能命中索引,为何要让数据库耗费更多的CPU帮助实施查询优化呢?

第七条:禁止使用负向查询,以及%开头的模糊查询

解读:
a) 负向查询条件:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,会导致全表扫描
b) %开头的模糊查询,会导致全表扫描
一般来说,WHERE过滤条件不会只带这么一个“负向查询条件”,还会有其他过滤条件,举个例子:查询沈剑已完成订单之外的订单(好拗口):
SELECT oid FROM t_order WHERE uid=123 AND status != 1;
订单表5000w数据,但uid=123就会迅速的将数据量过滤到很少的级别(uid建立了索引),此时再接上一个负向的查询条件就无所谓了,扫描的行数本身就会很少
但如果要查询所有已完成订单之外的订单:
SELECT oid FROM t_order WHERE status != 1;
这就挂了,立马CPU100%,status索引会失效,负向查询导致全表扫描

第八条:应用程序必须捕获SQL异常,并有相应处理

解读:方便维护,及时“查漏补缺”

总结:大数据量高并发的互联网业务,极大影响数据库性能的都不让用,不让用哟。

MySQL数据库规范及解读相关推荐

  1. MySQL 数据库规范--调优篇(终结篇)

    前言 这篇是MySQL 数据库规范的最后一篇--调优篇,旨在提供我们发现系统性能变弱.MySQL系统参数调优,SQL脚本出现问题的精准定位与调优方法. 目录 1.MySQL 调优金字塔理论 2.MyS ...

  2. MySQL数据库规范

    MySQL数据库规范 前言 今天我们来聊一聊MySQL数据库常见的一些建议设计规范,参考阿里的<JAVA开发手册泰山版>,我们简单挑出几处进行简单分析和回顾复习,如果有不正确或者不足的地方 ...

  3. 新华字典 mysql数据库_mysql系列一、mysql数据库规范

    一. 表设计 库名.表名.字段名必须使用小写字母,"_"分割. 库名.表名.字段名必须不超过12个字符. 库名.表名.字段名见名知意,建议使用名词而不是动词. 表必须使用InnoD ...

  4. mysql 数据库设计说明书_1.2 Mysql 数据库规范

    ## 1.数据库版本 1. mysql 5.6以上 ## 2.数据库排序规则 1. utf_general_ci ## 3. 命名规则 **_一律使用小写字母+数字_** 1.数据库命名规范 数据库, ...

  5. MySQL 数据库规范--开发篇

    1.sql语句编写 1.执行大的delete.update.insert操作要慎重,特别是对业务繁忙的系统,要尽量避免对线上业务产生影响. 解决办法是:大操作切割为小操作,使用limit子句限制每次操 ...

  6. mysql数据库:最全MySQL数据库设计建库、建表规范及经验(踩过坑才能积累经验!)

    废话 这两天还是在做刚接手的小项目,也是第一次一个人负责整个项目的所有流程,最后交给客户. 当自己去接触项目时,真的会踩很多很多坑,当然解决了就是很大的进步与成长.昨晚我就意识到自己给自己留了一个大坑 ...

  7. MySQL数据库,从入门到精通:第十四篇——MySQL视图详解

    MySQL数据库,从入门到精通:第十四篇--MySQL视图详解 第 14 篇_视图 1. 常见的数据库对象 2. 视图概述 2. 1 为什么使用视图? 2. 2 视图的理解 3. 创建视图 3. 1 ...

  8. MySQL数据库,从入门到精通:第十二篇——MySQL数据类型详解

    MySQL数据库,从入门到精通:第十二篇--MySQL数据类型详解 第 12 章_MySQL数据类型精讲 1. MySQL中的数据类型 2. 整数类型 2. 1 类型介绍 2. 2 可选属性 2. 2 ...

  9. MySQL数据库,从入门到精通:第七篇——MySQL单行函数应用

    MySQL数据库,从入门到精通:第七篇--MySQL单行函数应用 第七篇_单行函数 1. 函数的理解 1.1 什么是函数 1.2 不同DBMS函数的差异 2. 数值函数 2.1 基本函数 2.3 三角 ...

最新文章

  1. java 市场_java市场前景怎样?
  2. 3_10 MediaMode 中介者模式
  3. Servlet中获取文件在服务器主机的真实路径
  4. POJ1236Network of Schools——强连通分量缩点建图
  5. Storing and Retrieving Images from SQL Server using Microsoft .NET
  6. matlab中ncread读取nc文件其中一个三维参数的其中一维_Matlab使用技巧总结-1
  7. java volatile 原子性_为什么volatile不能保证原子性而Atomic可以?
  8. 运算放大器由来及虚短虚断的讨论
  9. excel卡住了还没保存怎么办?
  10. 后台推送消息给app_小米加入统一推送联盟!避免多种APP后台运行,国产手机春天来了...
  11. applecare多少钱?_AppleCare和AppleCare +有什么区别?
  12. element表格 频繁切换维度,导致表头渲染有误
  13. 迪文串口屏(DMG10600C101-03WTC)的通讯测试
  14. java最简单的代码
  15. 利用python进行股票分析(四)pandas
  16. Android三种模拟器介绍
  17. C# DocX操作Word文档(.docx)
  18. linux内存测试工具memtest,用Memtest86检测电脑内存
  19. 征服的荣耀服务器维护,《征服的荣耀》:游戏提供了场景编辑器,但内容的充实仍需等待...
  20. java实现排他平方数

热门文章

  1. hihoCoder #1033 : 交错和 [ 数位dp ]
  2. 3.0 Android组件之间的信使Intent
  3. Tokyo Tyrant优势
  4. 用VBS实现公司自动打卡
  5. Why String is Immutable or Final in Java
  6. ios-Text inset for UITextField
  7. python学习1(下载、安装)
  8. Windows 下使用GNU开发环境[转]
  9. 一个SQL SERVER功能模块表
  10. [转]没有找到 MFC42D.DLL,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。解决方法!...