# 58 到家 MySQL 军规升级版

## 基础规范

- 表存储引擎必须使用 `InnoDB`

- 表字符集默认使用 `utf8`,必要时候使用 `utf8mb4`

- 通用,无乱码风险,汉字 3 字节,英文 1 字节

- `utf8mb4` 是 `utf8` 的超集,有存储 4 字节例如表情符号时,使用它

- 禁止使用存储过程,视图,触发器,Event

- 对数据库性能影响较大,互联网业务,能让站点层和服务层干的事情,不要交到数据库层

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

- 禁止在数据库中存储大文件,例如照片,可以将大文件存储在对象存储系统,数据库中存储路径

- 禁止在线上环境做数据库压力测试

- 测试,开发,线上数据库环境必须隔离

## 命名规范

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

- abc,Abc,ABC 都是给自己埋坑

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

- tmp,wushan 谁 TM 知道这些库是干嘛的

- 库备份必须以 bak 为前缀,以日期为后缀

- 从库必须以 `-s` 为后缀

- 备库必须以 `-ss` 为后缀

## 表设计规范

- 单实例表个数必须控制在 `2000` 个以内

- 单表分表个数必须控制在 `1024` 个以内

- 表必须有主键,推荐使用 `UNSIGNED` 整数为主键

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

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

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

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

## 列设计规范

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

- 根据业务区分使用 `char/varchar`

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

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

- 根据业务区分使用 `datetime/timestamp`

- 前者占用 5 个字节,后者占用 4 个字节,存储年使用 `YEAR`,存储日期使用 `DATE`,存储时间使用 `datetime`

- 必须把字段定义为 `NOT NULL` 并设默认值

- NULL 的列使用索引,索引统计,值都更加复杂,MySQL 更难优化

- NULL 需要更多的存储空间

- NULL 只能采用 `IS NULL` 或者 `IS NOT NULL` ,而在 `=/!=/in/not in` 时有大坑

- 使用 `INT UNSIGNED` 存储 `IPv4` ,不要用 `char(15)`

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

- 牵扯到国家代号,可能出现 `+/-/()` 等字符,例如 `+86`

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

- `varchar` 可以模糊查询,例如 `like‘138%’`

- 使用 `TINYINT` 来代替 `ENUM`

- `ENUM` 增加新值要进行 `DDL` 操作

## 索引规范

- 唯一索引使用 `uniq_[字段名]` 来命名

- 非唯一索引使用 `idx_[字段名]` 来命名

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

- 互联网高并发业务,太多索引会影响写性能

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

- 异常复杂的查询需求,可以选择 `ES` 等更为适合的方式存储

- 组合索引字段数不建议超过 5 个

- 如果 5 个字段还不能极大缩小 row 范围,八成是设计有问题

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

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

- 踩过因为 `JOIN` 字段类型不一致,而导致全表扫描的坑么?

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

## SQL 规范

- 禁止使用 `select *`,只获取必要字段

- `select *` 会增加 `cpu/io/内存/带宽` 的消耗

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

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

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

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

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

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

- 导致不能命中索引,全表扫描

- 禁止负向查询以及 `%` 开头的模糊查询

- 导致不能命中索引,全表扫描

- 禁止大表 `JOIN` 和子查询

- 同一个字段上的 `OR` 必须改写问 `IN`,`IN` 的值必须少于 50 个

- 应用程序必须捕获 SQL 异常

- 方便定位线上问题

## 说明

本军规适用于并发量大,数据量大的典型互联网业务,可直接带走参考,不谢。

58 mysql 军规_58 到家 MySQL 军规升级版相关推荐

  1. mysql 军规_58到家MySQL军规升级版

    原标题:58到家MySQL军规升级版 一.基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1)通用,无乱码风险,汉字3字节,英文1字节 (2) ...

  2. 58 mysql 军规_58到家MySQL军规升级版(转)

    一.基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1)通用,无乱码风险,汉字3字节,英文1字节 (2)utf8mb4是utf8的超集,有存储 ...

  3. 58同城 mysql规范_58同城Mysql数据库设计原则(转)

    (一)核心原则 (1)不在数据库做运算 cpu计算务必移至业务层: (2)控制单表数据量 int型不超过1000w,含char则不超过500w:合理分表:限制单库表数量在300以内: (3)控制列数量 ...

  4. 58到家MySQL数据库开发规范(javamysql数据)

    58到家MySQL数据库开发规范(javamysql数据) 一.基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1)通用,无乱码风险,汉字3字 ...

  5. 关于MySQL联合索引和优化军规

    一.关于MySQL联合索引 总结记录一下关于在MySQL中使用联合索引的注意事项. 如:索引包含表中每一行的last_name.first_name和dob列,即key(last_name, firs ...

  6. 性能优化专题 - MySql 性能优化 - 04 - MySql调优

    目录导航 前言 Undo-log与Redo-log 案例 当前读.快照读 Redo Log的落盘配置 MySQL配置优化 MySQL服务器参数类型 快速定位MySql配置文件 MySQL内存参数配置 ...

  7. MySQL基础(二)【MySQL数据库对象与应用】

    2.1-MySQL数据类型 Number不止一种 ××× 浮点型 ××× INT SMALLINT MEDIUMINT BIGINT type Storage Minumun Value Maximu ...

  8. mha mysql 招聘_MHA实现mysql的高可用

    关于 MHA: 1.Master HA,对主节点进行监控,可实现自动故障转 移至其它从节点:通过提升某一从 节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多 从的架构 ...

  9. Mysql —— C语言链接mysql数据库,命令行形式(getopt()函数),用户、用户组增删改查(用户组表内有用户控制的策略字段)

    函数说明--getopt(): 函数说明 getopt()用来分析命令行参数.参数argc和argv分别代表参数个数和内容,跟main()函数的命令行参数是一样的. optstring中的指定的内容的 ...

最新文章

  1. java bip-39_bip39
  2. php重定向和静态化,PHP实现URL静态化
  3. Memcache所有方法及参数详解以及使用方法
  4. 传阿里旗下蚂蚁集团拟上市集资300亿美元,最快9月IPO
  5. 新当选ACM Fellow李向阳教授:心有理想 向阳而生
  6. 使用 Python+Selenium + 第三方库实现的简单的 web 自动化测试框架 源码
  7. [经验]自定义ASP.NET服务器控件属性的状态不能保存的问题
  8. FreeImage的配置与使用
  9. c语言单片机实验报告,本科单片机c语言实验手册(实验报告).doc
  10. matlab latex emf 乱码,latex 使用中的一些问题
  11. mysql系统找不到指定文件_mysql安装常见问题(系统找不到指定的文件、发生系统错误......
  12. 【CNN】——涨点模块SE,CBAM,CA对比
  13. stm32wb55 flash
  14. 前端开发者应该知道的 CSS 小技巧
  15. django 内置标签与过滤器
  16. 能源实现物联网云平台方案
  17. 无须数据线,实现电脑手机快速互传
  18. 几十元维修Dreasourcelab的DSLogic Pro 逻辑分析仪?
  19. 计算机考研英语一和英语二的区别,考研英语一和英语二的区别,考研党知道了吗?...
  20. 希尔伯特黄变换matlab,HHT变换的三种方法 Matla

热门文章

  1. 计算机联锁系统操作显示规范,计算机联锁系统系列操作基础手册.doc
  2. 兼容 向前兼容 向后兼容
  3. Ubuntu18保姆级教程及其jdk和hadoop安装含资源
  4. IT人士应当知道的10个行业小内幕
  5. linux直接联网安装mysql,linux环境下安装mysql
  6. FireFox浏览器缓存路径设置
  7. 初中女生数学不好能学计算机,初中女生数学成绩为什么差?都是这五个特性在作祟,越早改掉越好...
  8. Ubuntu14无法识别U盘和硬盘
  9. 计算机磁盘功能,X-ways Forensics磁盘快照功能介绍
  10. 畅所欲言吧!神器助你避开毕姥爷那样的饭局门