MySQL已经成为世界上最受欢迎的数据库管理系统之一,无论是用在小型开发项目上,还是用在构建那较大型的网站,MySQL都用实力证明了自己是一个稳定、可靠、快速、可信的系统,足以胜任任何数据存储业务的需要。本文总结了MySQL的使用规范

 

1.必须使用InnoDB存储引擎

有更好的CPU和IO性能,更好的备份和锁表机制,提高统计和调试效率。

另外,作为一 个系统,InnoDB支持多种关键功能,其中最重要的是事务日志和行级锁。事务日志记录真正的数据库事务,但更重要的是数据崩溃恢复和回滚。

基于 InooDB方式的IO,能给予更安全数据保护和更好性能表现。另外,在大多数的情况下,行级锁可以提供更高的并发性能,因为用户只锁定他们正在写的数据,而读数据永远不会被阻塞 。

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

方便日后新人小哥,更快理解熟悉;并且可读性更好。同时在status这类字段上标注:0表示删除,1表示正常 等枚举值。

3.必须使用UTF8mb4字符集

utf8是通用的字符集,mb4 在utf8上进行了扩展,支持emoj等新的字符。

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

高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,数据库擅长存储与索引,CPU计算在业务层更合理。

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

当人员照片较多时,分页查询速度明显变慢,之前1秒内响应,加了照片字段后,需要4~5秒左右才能响应。
大文件和照片存储在文件系统,数据库里存URI更好

6.表必须有主键,例如自增主键

a)主键递增,数据行写入可以提高插入性能,可以避免Page分裂,减少表碎片提升空间和内存的使用。
b)使用数字类型主键,较短的数据类型可以有效的减少索引的磁盘空间,提高索引的缓存效率。
c)无主键的表删除,在ROW模式的主从架构,会导致备库夯住。
d) 更多使用业务主键,在分库分表会有更多便利性。

7.禁止使用外键,如果有外键完整性约束,需要应用程序控制

外键会导致表与表之间耦合,Update与Delete操作都会涉及相关联的表,十分影响SQL的性能,甚至会造成死锁。

8.必须把字段定义为NOT NULL并且提供默认值

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

如:where name!='nx',如果存在name为null值的记录,查询结果就不会包含name为null值的记录。

9.禁止使用TEXT、BLOB类型

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

10.禁止使用小数存储货币

使用整数吧,小数容易导致钱对不上。

11.必须使用varchar(20)存储手机号

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

12.禁止使用ENUM,可使用TINYINT代替

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

13.关于索引设计

(1)单表索引建议控制在5个以内

索引并不是越多越好!索引可以提高效率同样可以降低效率。

索引可以增加查询效率,但同样也会降低插入和更新的效率,甚至有些情况下会降低查询效率。

因为MySQL优化器在选择如何优化查询时,会根据统一信息,对每一个可以用到的索引来进行评估,以生成出一个最好的执行计划,如果同时有很多个索引都可以用于查询,就会增加MySQL优化器生成执行计划的时间,同样会降低查询性能。

(2)禁止在更新十分频繁、区分度不高的属性上建立索引

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

(3)建立组合索引,必须把区分度高的字段放在前面

理由:能够更加有效的过滤数据

14.关于SQL使用规范

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

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

(2)禁止在WHERE条件的属性上使用函数或者表达式

理由:SELECT uid FROM t_user WHERE from_unixtime(day)>='2019-10-09' 会导致全表扫描
正确的写法是:SELECT uid FROM t_user WHERE day>= unix_timestamp('2019-10-09 00:00:00')

(3)禁止负向查询,以及%开头的模糊查询

理由:
a)负向查询条件:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,会导致全表扫描
b)%开头的模糊查询,会导致全表扫描

(4)禁止大表使用JOIN查询,禁止大表使用子查询

理由:会产生临时表,消耗较多内存与CPU,极大影响数据库性能

(5)禁止使用OR条件,必须改为IN查询

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

MySQL 使用规范总结的更多相关文章

  1. [转载] 根据多年经验整理的《互联网MySQL开发规范》

    原文: http://weibo.com/p/2304181380b3f180102vsg5 根据多年经验整理的<互联网MySQL开发规范> 写在前面:无规矩不成方圆.对于刚加入互联网的朋 ...

  2. [转发] 老叶观点:MySQL开发规范之我见

    原文: http://imysql.com/2015/07/23/something-important-about-mysql-design-reference.shtml 老叶观点:MySQL开发 ...

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

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

  4. 从MySQL开发规范处看创业

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/n88Lpo/article/details/78099185 作者:唐勇.深圳市环球易购.MySQL ...

  5. MySQL数据库规范

    Mysql数据库规范 一.基础规范 [强制]使用InnoDB存储引擎解读:InnoDB存储引擎是MySQL默认存储引擎,支持事务和行级锁,并发性能更好,CPU及内存缓存页优化使得资源利用率更高[强制] ...

  6. 建议收藏 - 专业的MySQL开发规范

    为了项目的稳定,代码的高效,管理的便捷,在开发团队内部会制定各种各样的规范 这里分享一份我们定义的MySQL开发规范,欢迎交流拍砖 数据库对象命名规范 数据库对象 命名规范的对象是指数据库SCHEMA ...

  7. mysql 数据库 规范

    目录 mysql 数据库 规范 基础规范 命名规范 表设计规范 字段设计规范 索引设计规范 SQL编写规范 行为规范 mysql 数据库 规范 基础规范 必须使用InnoDB存储引擎 解读:支持事务. ...

  8. 阿里:MySQL数据库规范

    阿里:MySQL数据库规范 简介:基于阿里数据库设计规范扩展而来 设计规范 1.[推荐]字段允许适当冗余,以提高查询性能,但必须考虑数据一致.冗余字段应遵循: 不是频繁修改的字段. 不是 varcha ...

  9. MySQL使用规范

    一.    表设计类 强制类规范 1. 创建表的存储引擎必须是InnoDB. 2. 每个表必须显式的指定一个主键. 3. 不允许使用联合主键. 4. 不允许使用外键. 5. 不允许存在和主键重复的索引 ...

  10. 根据多年经验整理的《互联网MySQL开发规范》

    一.基础规范 使用 INNODB 存储引擎 表字符集使用 UTF8  所有表都需要添加注释 单表数据量建议控制在 5000W 以内 不在数据库中存储图⽚.文件等大数据 禁止在线上做数据库压力测试 禁⽌ ...

随机推荐

  1. Xnip Mac上方便好用的截图工具

    Xnip Mac上方便好用的截图工具 标注 Xnip 拥有齐全的标注功能,您可以对截取的图片进行标注,在标注的同时还能重新调整截图大小. 查看标注操作 GIF 滚动截图 Xnip 的滚动截图功能可以让 ...

  2. MySQL 日志详解

    一.MySQL 日志分类 MySQL 日志主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志. 错误日志: -log-err (记录启动.运行.停止 MySQL 服务时出现的信息) 查询日 ...

  3. 《New Horizon College English》 (Third Edition) -长篇阅读(Skmming and Scanning)

    <New Horizon College English>(Third Edition) <新视野大学英语>(第三版) 长篇阅读(Skmming and Scanning) 总 ...

  4. SpringBoot 完整学习笔记免费分享

    从0到进阶,完全系统性的学习笔记 每次我都会反复拿来观看,因为我们总会有遗漏忘记的地方,但是笔记不会. 希望大家能好好利用它,以下是笔记截图! 以上只是其中的一项部分,这份笔记可以说含金量超高,绝对会 ...

  5. 初识 MongoDB 和 .NET Core 入门

    昨天搭建完毕 MongoDB 集群 后,开始计划了解 MongoDB ,并引入使用场景,这里介绍一下学习过程中的一些笔记,帮助读者快速了解 MongoDB 并使用 C# 对其进行编码. 浅入 Mong ...

  6. go 下载图片

    package main import ( "net/http" "fmt" "io/ioutil" "strings" ...

  7. centos8使用systemctl管理运行级别

    一,什么是systemd的target? 1,关于systemd/systemctl的相关知识,请移步到这一篇 https://www.cnblogs.com/architectforest/p/12 ...

  8. matplotlib 饼状图

    import matplotlib.pyplot as plt import matplotlib as mpl # 支持中文 plt.rcParams['font.sans-serif'] = [' ...

  9. Ubuntu18.04中安装virtualenv和virtualenvwrapper

    1.安装virtualenv和virtualenvwrapper pip3 install virtualenv pip3 install virtualenvwrapper 2.创建目录用来存放虚拟 ...

  10. Helium文档13-WebUI自动化-helium快速切换到selenium状态并调用其方法

    前言 前面说过helium是对Selenium 进行了封装,那么我们如何使用selenium的方法呢,通过下面的介绍,我们能够清楚在helium中能够使用selenium的任何方法 入参介绍 def ...