58到家数据库30条军规解读

此篇文章来源于微信公众号[架构师之路],为了帮助记忆,现在抄写与此,如有侵权,告知立刻删除,谢谢!

军规使用场景:并发量大、数据量大的互联网业务

基础规范

  • 必须使用 InnoDB 存储引擎:支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高
  • 必须使用 UTF8 字符集:万国码、无需转码、五乱码风险,节省空间
  • 数据表、数据字段必须加入 中文注释 :好记忆不如烂笔头
  • 禁止 使用存储过程、视图、触发器、Event:高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的情况下这些功能可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”。数据库擅长存储与索引,CPU计算还是上移吧。
  • 禁止 存储大文件或者大图片:不要让数据库做不擅长的事,大文件和图片存储在文件系统,数据库里存URI就好。

命名规范

  • 只允许使用 内网域名 ,而不是ip来连接数据库
  • 线上环境、开发环境、测试环境数据库内网域名遵循命名规范:
  • 库名、表名、字段名:小写,下划线风格,不超过32个字符,必须见名知意,禁止拼音英文混用
  • 表名txxx, 非唯一索引名idxxxx, 唯一索引名uniq_xxx

表设计规范

  • 单实例表的数目必须小于500
  • 单表的列数目必须小于30
  • 表必须有主键,例如自增主键:提高数据插入性能,避免page分裂,减少表碎片提升空间和内存的使用;主键选择较短的数据类型,减少索引的磁盘空间,提高索引的缓存效率;无主键的表删除,在row模式的主从架构,会导致备库绷住
  • 禁止 使用外键,如果有外键完整性约束,需要应用程序控制:外键会导致表与表之间耦合,update与delete操作都会涉及相关联的表,十分影响sql的性能,甚至造成死锁。大数据高并发业务场景下数据使用以性能优先

字段设计规范

  • 必须把字段设计为 NOT NULL 并且提供默认值:null的列使索引/索引统计/值比较都更加复杂,对MySQL来说更加难优化;null类型在MySQL中需要特殊处理,消耗数据库性能;null值需要更多的存储空间,无论是表还是索引中的null值都需要额外的空间来标识;对null的处理只能使用is null 或is not null,而不能采用=、in等操作符号。
  • 禁止 使用TEXT、BLOB类型:浪费更多的磁盘和内存空间,导致缓存命中率低,影响性能
  • 禁止 使用小数存储货币:小数容易导致精度误差
  • 必须使用varchar(20)存储手机号:可能涉及区号或国家代码,varchar支持模糊查询 like
  • 禁止 使用ENUM, 可使用TINYINT代替:增加新ENUM值要做DDL操作,内部实际就是整数

索引设计规范

  • 单表索引建议控制在5个以内:太多影响update和delete性能
  • 单索引字段数不允许超过5个:太多起不到过滤效果
  • 禁止 在更新十分频繁、区分度不高的属性上建立索引:更新会变更底层的B+树,更新频繁的字段建立索引会大大降低数据库性能;区分度不高的属性,建立索引起不到过滤数据的效果,性能与全表扫描类似
  • 建立组合索引,必须把区分度高的字段放在前面:能够更加有效过滤数据,与查询优化器算法相关

SQL使用规范

  • 禁止 使用SELECT *,只获取必要的字段,需要显示说明列属性:增加消耗,不能有效利用覆盖索引,容易在增加或删除字段后出现程序BUG
  • 禁止 使用INSERT INTO t_xxx VALUES(xxx), 必须显示指定插入的列属性:容易在增加或删除字段后出现程序BUG
  • 禁止 使用属性隐式转换:会导致不能命中索引,而采用全表扫描;SELECT uid FROM tuser WHERE phone=13812345678会导致全表扫描,而不能命中phone索引,因为phone字段是varchar(20),正确的写法是:SELECT uid FROM tuser WHERE phone=’13812345678′;
  • 禁止 在WHERE条件的属性上使用函数或者表达式:会导致不能命中索引,而采用全表扫描;SELECT uid FROM tuser WHERE fromunixtime(day)>=’2017-02-15’会导致全表扫描,正确的写法是:SELECT uid FROM tuser WHERE day>=unixtimestamp(‘2017-02-15 00:00:00’)
  • 禁止 负向查询,以及%开头的模糊查询:负向查询条件:以NOT、!开头或者<>,导致全表扫描;%开头的模糊查询,导致全表扫描
  • 禁止 大表使用JOIN查询,禁止大表使用子查询:会产生临时表,消耗较多内存与CPU,极大影响数据库性能
  • 禁止 使用OR条件,必须改为IN查询:MySQL旧版本OR查询不能命中索引,新版本需要消耗CPU才能查询优化后命中索引
  • 应用程序必须捕获SQL异常,并有相应处理

小结

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

时间: 2024-10-05 05:02:06

58到家数据库30条军规解读的相关文章

【转】58到家数据库30条军规解读

一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省空间 (3)数据表.数据字段必须加入中文注释 解读:N年后谁tm知道这个r1,r2,r3字段是干嘛的 (4)禁止使用存储过程.视图.触发器.Event 解读:高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服

58到家数据库30条军规

军规适用场景:并发量大.数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省空间 和DBA负责人确认后,纠正为"新库默认使用utf8mb4字符集". 这点感谢网友的提醒,utf8mb4是utf8的超集,emoji表情以及部分不常见汉字在utf8下会表现为乱码,故需要升级

用尽洪荒之力整理的Mysql数据库32条军规

今天上午吐血整理了Oracle SQL性能优化的40条军规,其中很多规则也是适用于Mysql的,结果今晚发现这一篇文章——用尽洪荒之力整理的Mysql数据库32条军规,和我的竟有异曲同工之妙,当然不同的是这是由具有12年Java开发经验的老鸟写的,其见解和认识肯定比我的更加深刻,感谢前辈,现全文转载如下: --------------------------------------------------------------split line------------------------

&lt;转载&gt; 58到家数据库设计规范

原文地址: http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651959906&idx=1&sn=2cbdc66cfb5b53cf4327a1e0d18d9b4a&chksm=bd2d07be8a5a8ea86dc3c04eced3f411ee5ec207f73d317245e1fefea1628feb037ad71531bc&mpshare=1&scene=23&srcid=021695B

MySQL数据库25条规范解读(转)

一.基础规范 (1)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省空间(由于移动设备原因最好使用utf8mb4) (2)禁止使用存储过程.视图.触发器.Event 解读:高并发大数据的互联网业务,架构设计思路是"解放数据库CPU,将计算转移到服务层",并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现"增机器就加性能".数据库擅长存储与索引,CPU计算还是上移吧 (3)禁止存储大文件或者大照片 解读:为何

shopnc框架数据库查询限制30条记录

   shopnc框架数据库查询方法:Model()->table("表名")->select();假如你的表中数据大于30条,你查到的 结果中会只显示30条,解决方法是:查询语句中假如limit方法,即Model()->table("表名")-> limit(false)->select();

运维的85条军规

“前车之鉴,后事之师”,对于IT运维工程师来说,了解行业的规则,并能将其牢记于心,必将对你的工作起到事半功倍的效果,下面一起来学习下所谓的<运维85条军规>: 1) 承载能力优先 ——随后再进行优化 —— 不遵守这条规则必定带来故障停机时间.不要在故障停机时间的压力下进行优化——要先集中精力提高承载能力. 2) 以Postgres为例,一定要确保你的每一个网络都能匹配得上你的WAL文件.Slony复制.快照技术以及基于磁盘的DB版本化(快照的衍生品) 3) 不要把问题‘优化’到你的架构之中.为

【MySql】赶集网mysql开发36条军规

[MySql]赶集网mysql开发36条军规 2012-05-14 14:02:33 分类: Linux 写在前面的话: 总是在灾难发生后,才想起容灾的重要性: 总是在吃过亏后,才记得曾经有人提醒过. (一)核心军规 (1)不在数据库做运算 cpu计算务必移至业务层: (2)控制单表数据量 int型不超过1000w,含char则不超过500w: 合理分表: 限制单库表数量在300以内: (3)控制列数量 字段少而精,字段数建议在20以内: (4)平衡范式与冗余 效率优先: 往往牺牲范式: (5)

开发婚恋交友类网站的13条军规

现在在线婚恋交友行业成了社会最大的经济来源之一.几乎零成本就能赚到钱,当然了,这个"零"比你想象的要多一点点--你需要为今后的工作搭建一个完美的网站. 你可能会想什么才是完美的网站呢?现在我就来为您详解这类网站最有价值的构成要素,还会为您精确解读开发过程中的每个阶段,所以请不要错过这篇文章的任何一个字! 如何创造一个优秀的婚恋网站 1.做一个竞争调查 在每一片商业红海竞争都极其惨烈,这早已不是秘密.在你开始做你的产品之前,你最后应该先去调查一下已经存在的站点.看一看最成功的一个,同时也