一、基础规范

  1. 使用InnoDB存储引擎
    支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高
  2. 推荐使用utf8mb4字符集
    无需转码,无乱码风险, 支持emoji表情以及部分不常见汉字
  3. 表、字段必须加注释
    方便他人理解字段意思,在后期维护中非常非常有用,不用去瞎猜这个字段是干嘛的。
  4. 不在数据库做计算
    禁止使用存储过程、视图、触发器、Event。
    在并发量大的情况下,这些功能很可能将数据库拖跨,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”
  5. 禁止存储文件
    文件存储在文件系统,数据库里存URI
  6. 控制单表数据量
    单表记录控制在千万级

二、命名规范

  1. 库名、表名、字段名:小写,下划线风格
    非唯一索引名idxxxx,唯一索引名uniqxxx
  2. 表必须有主键,例如自增主键
    a)主键递增,数据行写入可以提高插入性能
    b)主键要选择较短的数据类型,Innodb引擎普通索引都会保存主键的值,较短的数据类型可以有效的减少索引的磁盘空间,提高索引的缓存效率
    c)保证实体的完整性,唯一性
  3. 不要使用外键,如果有外键约束,用应用程序控制
    外键会导致表与表之间耦合,update与delete操作都会涉及相关联的表,十分影响sql 的性能,甚至会造成死锁。高并发情况下容易造成数据库性能下降,大数据高并发业务场景数据库使用以性能优先

三、字段设计规范

  1. 把字段定义为NOT NULL并且提供默认值
    a)null的列使索引/索引统计/值比较都更加复杂,对MySQL来说更难优化
    b)null 这种类型MySQL内部需要进行特殊处理,增加数据库处理记录的复杂性;同等条件下,表中有较多空字段的时候,数据库的处理性能会降低很多
    c)null值需要更多的存储空间,无论是表还是索引中每行中的null的列都需要额外的空间来标识
    d)对null 的处理时候,只能采用is null或is not null,而不能采用=、in、<、<>、!=、not in这些操作符号。如:where name!=’zhangsan’,如果存在name为null值的记录,查询结果就不会包含name为null值的记录
  2. 不要使用TEXT、BLOB类型
    会浪费更多的磁盘和内存空间,非必要的大量的大字段查询会淘汰掉热数据,导致内存命中率急剧降低,影响数据库性能,如果必须要使用则独立出来一张表,用主键来对应,避免影响其它字段索引效率
  3. 不要使用小数存储货币
    建议使用整数,小数容易导致钱对不上
  4. 必须使用varchar存储手机号
    手机号会去做数学运算么?
  5. 为提高效率可以牺牲范式设计,冗余数据
    a)不是频繁修改的字段
    b)不是 varchar 超长字段,更不能是 text 字段

四、索引设计规范

  1. 禁止在更新十分频繁、区分度不高的属性上建立索引
    a)更新会变更B+树,更新频繁的字段建立索引会大大降低数据库性能
    b)“性别”这种区分度不大的属性,建立索引是没有什么意义的
  2. 建立组合索引,必须把区分度高的字段放在最左边
    因为使用单字段查询时会使用组合索引的左边字段而不使用右边的字段,如果 where a=? and b=? , a 列的几乎接近于唯一值,那么只需要单建 idx_a 索引即可
  3. 页面搜索严禁左模糊或者全模糊
    索引文件具有 B-Tree 的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引, 如果需要请走搜索引擎来解决

五、SQL使用规范

  1. 禁止使用SELECT *,只获取必要的字段,需要显示说明列属性
    a)消耗cpu,io,内存,带宽
    b)不能有效的利用覆盖索引
    c)使用SELECT *容易在增加或者删除字段后出现程序BUG, 不具有扩展性
  2. 使用INSERT INTO t_xxx VALUES(xxx),必须显示指定插入的列属性
    容易在增加或者删除字段后出现程序BUG
  3. 务必请使用“同类型”进行比较,否则可能全表扫面
    SELECT name FROM t_user WHERE phone=1888888888 会导致全表扫描.
  4. 禁止在WHERE条件的上使用函数或者计算
    解读:SELECT naem FROM tuser WHERE date(createdatatime)='2017-12-29' 会导致全表扫描
    推荐的写法是:SELECT name FROM tuser WHERE createdatatime>= '2017-12-29' and create_datatime < '2017-12-30'
  5. 禁止负向查询,以及%开头的模糊查询
    a)负向查询条件:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,会导致全表扫描
    b)%开头的模糊查询,会导致全表扫描
  6. 不要大表使用JOIN查询,禁止大表使用子查询
    会产生临时表,消耗较多内存与CPU,极大影响数据库性能
  7. OR改写为IN()或者UNION
    原因很简单or不会走索引
  8. 简单的事务
    事务就像程序中的锁一样粒度尽可能要小
  9. 不要一次更新大量数据
    数据更新会对行或者表加锁,应该分为多次更新

MySQL优化之推荐使用规范相关推荐

  1. mysql主键自增长_全面的MySQL优化面试解析

    本文概要 文章内图片有损,需要高清可以在公众号内回复"大图" 概述 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理 ...

  2. 单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构

    015-08-09 杨尚刚 高可用架构 此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美 ...

  3. MySQL 优化思路与工具

    MySQL 优化思路与工具 1 优化思路 2 连接--配置优化 第一个环节是客户端连接到服务端,连接这一块有可能会出现什么样的性能问题? 有可能是服务端连接数不够导致应用程序获取不到连接.比如报了一个 ...

  4. Mysql优化第一弹:彻底征服女朋友

    人世仙家本自殊,何须相见向中途.惊鸿瞥过游龙去,漫恼陈王一事无. 嗨,大家好,我是洛神,性别男.一个来自快乐星球的程序员. 欢迎大家专注我的公众号[程序员洛神],我会不定期发放福利哟~ 前言 这篇文章 ...

  5. 第十二章 MySQL优化

    1. 优化哲学 1.1 为什么优化? 为了获得成就感? 为了证实比系统设计者更懂数据库? 为了从优化成果来证实优化者更有价值? 但通常事实证实的结果往往会和您期待相反! 优化有风险,涉足需谨慎! 1. ...

  6. [转]单表60亿记录等大数据场景的MySQL优化和运维之道

    本文作者: 杨尚刚 ,美图公司数据库高级DBA,负责美图后端数据存储平台建设和架构设计.前新浪高级数据库工程师,负责新浪微博核心数据库架构改造优化,以及数据库相关的服务器存储选型设计. 前言 MySQ ...

  7. MYSQL 优化常用方法

    1.选取最适用的字段属性  MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能, 我们可以将表中字段的宽度设 ...

  8. mysql 数据库表结构设计与规范

    mysql 数据库表结构设计与规范 DDL(data difinition language)就是数据定义语言. 1.sql语句的界定符 [code]– 默认情况下" ; " 代表 ...

  9. 项目中常用的19条MySQL优化

    声明一下:下面的优化方案都是基于 " Mysql-索引-BTree类型 " 的 一.EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划. 下面来个简单 ...

最新文章

  1. NuGet(微软.NET开发平台的软件包管理工具)在VisualStudio中的安装的使用
  2. C++STL之string (转)
  3. 接入广域网技术——NAT内、外部网络地址转换
  4. Uva 10305 - Ordering Tasks
  5. python 教材为什么喜欢用spam举例_斯坦福大学教授列举出的python入门最容易犯的错误,你中招了吗?...
  6. App后台开发运维和架构实践学习总结(8)——后台产品设计的4个原则
  7. python人脸识别教程_50行Python代码+OpenCV实现人脸识别!史上最详细的教程!
  8. 为什么把持久化放到Domain Object是不OO的.
  9. js字符串与数字比较大小
  10. python qt 按钮实现拖放_[Python自学] PyQT5-控件拖拽、剪切板
  11. 队列与栈(Queue,Deque,Stack)
  12. ie11不兼容java_解决ie11不兼容的多个方法
  13. 快门(曝光时间)、光圈、感光度(ISO)的关系
  14. MQ 消息丢失、重复、积压问题,如何解决?
  15. 3D音频再现理论研究(一)---3D音频技术历史介绍(转)
  16. ORACLE 中OVER()结合rank(),dense_rank(),rownumber() 使用方法
  17. ug908 Programming and Debugging
  18. send disconnect: Broken pipe SFTP 登录
  19. 周杰伦粉丝赢了超话大战
  20. i5 10400F处理器性能怎么样

热门文章

  1. 【小白学习C++ 教程】十四、C++ 中预处理器
  2. node mysql limit_node中mysql连接池的connectionLimit指什么,它和mysql的最小连接数和最大连接数的关系是什么?...
  3. ACL 2020 | 用于多领域端到端任务型对话系统的动态融合网络
  4. 你的 CRF 层的学习率可能不够大
  5. 一文带你看懂PaddleHub
  6. 与AI大牛面对面:人工智能机器人,助手还是终结者?| 活动报名
  7. JAVA 继承和派生4.1-4.3 2020.3.20
  8. POJ 1696 Space Ant(极角排序)【计算几何】
  9. IntelliJ IDEA快捷键学习
  10. python包安装_Python及图像处理相关包安装