军规适用场景:大并发、大数据的互联网业务。使用InnoDB存储引擎解释:支持事务,行级锁,更好的并发性能,CPU和内存缓存页面优化让资源利用率更高,节省空间(3)数据表和数据字段必须加中文注解。解读:谁知道N年后r1、r2、r3字段是干什么用的(4)禁止使用存储过程、视图、触发器和Events。解读:对于高并发、大数据的互联网业务,架构设计思路是“解放数据库的CPU,把计算转移到服务层”。在并发量大的情况下,这些功能很可能把数据库拖死,业务逻辑还是放在服务层比较好。可扩展性可以轻松实现“加机器提高性能”。数据库擅长存储和索引,CPU计算应该上移!(5)禁止存储大文件或大照片解读:为什么要让数据库做它不擅长的事情?大文件和照片存储在文件系统中,将URI存储在数据库中很好。2.命名规范(6)只允许使用内网域名,不能使用ip连接数据库(7)线上环境、开发环境、测试环境数据库内网域名遵循命名规范企业名称:xxx线上环境:dj。xxx。db开发环境:dj.xxx.rdb测试环境:dj.xxx.tdb从库名称后加-s标识,备库在线从库名称后加-ss标识:dj.xxx-s。dbonline备份数据库:dj.xxx-sss.db(8)库名、表名、字段名:小写,下划线样式,不超过32个字符,名字必须熟悉,禁止拼音和混用英文(9)表名t_xxx,非***索引名idx_xxx,***索引名uniq_xxx3.表设计规范(10)单实例表数量必须小于500(11)单实例数量-表列必须小于30(12)表必须有主键,比如自增主键的解释:a)主键自增,数据行写入可以提高插入性能,避免分页,减少表碎片,提高空间和内存使用率b)为主键选择更短的数据类型,和Inno的公共索引dbengine会保存主键值,较短的数据类型可以有效减少索引的磁盘空间,提高索引的缓存效率c)删除没有主键的表,行模式的主从架构,会导致备库被夯(13)禁止使用外键,如果有外键完整性约束,需要应用程序控制。解读:外键会造成表之间的耦合,update和delete操作会涉及到相关表,会极大地影响SQL的性能,甚至会造成死锁。在高并发的情况下,很容易造成数据库性能问题。在大数据和高并发业务场景中使用数据库,优先考虑性能。第四,字段设计规范(14)必须将字段定义为NOTNULL并提供默认值。统计/值比较比较复杂,针对MySQL优化难度更大b)null这类MySQL内部需要特殊处理,增加了数据库处理记录的复杂度;同样条件下,当表中空字段较多时,数据库的处理性能会降低很多index,需要额外的空间来标识d)处理null时,只能是isnull或isnotnull,不能在这些操作符中使用=,in,<,<>,!=,not。例如:wherename!='shenjian',如果有name为空值的记录,则查询结果将不包含name为空值的记录(15)禁止使用TEXT和BLOB类型。空间,大量不必要的大字段查询会淘汰热数据,导致内存效率急剧下降,影响数据库性能(1??6)禁止使用小数来存储货币17)必须使用varchar(20)存储手机号解释:a)涉及区号或国家码时,可能会出现+-()b)手机号会做数学运算吗?c)varchar可以支持模糊查询,例如:like"138%"(18)禁止使用ENUM,可以使用TINYINT解释:a)添加一个新的ENUM值需要DDL操作b)ENUM内部实际存储是一个整数。你认为你定义了一个字符串?5.索引设计规范(19)建议将单表索引控制在5个以内(20)单索引字段数不允许超过5个对更新频繁、差异化不高的属性建立索引的解释:a)更新会改变B+树,索引频繁更新的字段会大大降低数据库性能。没有意义,不能有效过滤数据。性能类似于全表扫描(22)建立复合索引,必须将区分度高的字段放在最前面。解读:可以更有效地过滤数据。禁止使用SELECT*,只获取必要的字段,需要显示描述列属性解释:a)读取不必要的列会增加CPU、IO、NET消耗b)不能有效使用覆盖索引c)使用SELECT*容易增加或者删除一个字段后出现程序BUG(24)。禁止使用INSERTINTOt_xxxVALUES(xxx),必须显示指定的插入列属性。解读:添加或删除字段后容易出现。SELECTuidFROMt_userWHEREphone=13812345678会导致全表扫描,但无法***phone索引,猜猜为什么?(这个在线问题出现过不止一次)(26)禁止在WHERE条件的属性上使用函数或表达式格式解释:SELECTuidFROMt_userWHEREfrom_unixtime(day)>='2017-02-15'会导致全表扫描。正确的写法是:SELECTuidFROMt_userWHEREday>=unix_timestamp('2017-02-1500:00:00')(27)prohibited以%开头的否定查询和模糊查询解释:a)否定查询条件:NOT,!=,<>,!<,!>,NOTIN,NOTLIKE等,会导致全表扫描b)%开头模糊查询会导致全表扫描(28)禁止使用JOIN查询大表,禁止对大表使用子查询,必须改成IN查询解释:旧版Mysql的OR查询不能安装索引。即使可以安装索引,为什么数据库还要消耗更多的CPU来帮助实现查询优化呢?(30)应用必须CatchSQL异常并进行相应处理【本文为专栏作者“58神剑”原创稿件,转载请联系原作者】点此查看本作者更多好文章
