今天主要分享mysql数据库规范,仅供参考。从基础、命名、表设计、字段设计、索引设计、sql编写、行为规范等方面进行介绍。基本规格(1)必须使用InnoDB存储引擎说明:支持事务,行级锁,更好的并发性能,CPU和内存缓存页面优化,使资源利用率更高(2)新库使用utf8mb4字符集说明:Unicode,无需转码,无乱码风险,节省空间(3)数据表和数据字段必须加中文注释:主要是避免离开公司后没人知道这些字段是什么意思(4)禁止转载使用存储过程、视图、触发器、事件描述:对于高并发、大数据的互联网业务,架构设计思路是“解放数据库的CPU,把计算转移到服务层”。在并发量大的情况下,这些功能很可能把数据库拖死,业务逻辑放在服务层。具有更好的可扩展性,可以轻松实现“加机器提高性能”。数据库擅长存储和索引,CPU计算应该上移。(5)禁止存储大文件或大照片解释:为什么要让数据库做它不擅长的事情?大文件和照片存储在文件系统中,而数据库主要用于存储URI。命名规范(1)只允许使用内网域名,不能使用ip连接数据库在线环境、开发环境、测试环境数据库内网域名遵循命名规范业务名称:xxx在线环境:dj.xxx.db开发环境:dj.xxx.rdb测试环境:dj.xxx.tdb从库名称后加-s标识,备库名称后加-ss标识在线从库:dj.xxx-s.db在线备份图书馆:DJ。xxx-sss.db(2)库名、表名、字段名:小写,下划线样式,不超过32个字符,必须从名字上看清楚,禁止拼音和英文表名混用t_xxx,非唯一indexnameidx_xxx,uniqueindexNameuniq_xxx表设计规范(1)单实例表数小于500,单表列数小于30,表必须有主键,如asanauto-incrementprimarykey说明:主键自增,写入数据行可以提高插入性能,避免pageSplit,减少表碎片,提高空间和内存占用,为主键选择更短的数据类型,Innodb引擎普通索引会保存主键的值,较短的数据类型可以有效减少索引的磁盘空间,提高索引的缓存效率主键的表删除,在主从架构中行模式,会导致se要夯实的备用数据库。(2)禁止使用外键。如果存在外键完整性约束,则需要应用程序控制。耦合、更新和删除操作都会涉及到相关的表,这会极大地影响SQL的性能,甚至会造成死锁。在高并发的情况下,容易造成数据库性能问题,大数据、高并发业务场景下使用数据库优先考虑性能。字段设计规范(1)字段必须定义为NOTNULL,并且必须提供默认值注意:空列使得索引/索引统计/值比较更加复杂,MySQL优化null这种类型的MySQL更加困难需要特殊的内部处理,增加了数据库处理记录的复杂性;同样条件下,当表中有很多空字段时,数据库的处理性能会降低。许多null值需要更多的存储空间,无论是表中的每一行还是索引中的Null列都需要额外的空间来识别null的处理。只有isnull或isnotnull可以用来代替=、in、<、<>、!=和notin等操作符号。例如:wherename!='shenjian',如果存在名称为空值的记录,则查询结果将不包含名称为空值的记录(2)禁止使用TEXT和BLOB类型。空间,大量不必要的大字段查询会淘汰热数据,导致内存命中率急剧下降,影响数据库性能(3)不要使用小数来存储货币说明:使用整数,小数容易造成金额不正确(4)必须用varchar(20)来存储手机号注意:涉及到区号或国家码时,可能会有+-()手机号会做数学运算吗?varchar可以支持模糊查询,例如:like"138%"(5)Forbidden如果使用ENUM,可以使用TINYINT代替。说明:添加新的ENUM值需要DDL操作。ENUM内部实际存储为整型索引设计规范(1)建议单表索引数量限制在5个以内。注意:当超过5个字段时,实际(2)是禁止的为更新非常频繁且区分度低的属性创建索引。说明:更新会改变B+树,索引频繁更新的字段会大大降低数据库性能。为几乎没有区别的属性建立索引是没有意义的。不能有效过滤数据,性能与全表扫描类似。过滤数据的SQL编写规范(1)禁止使用SELECT*,只获取必要的字段,需要显示description列属性说明:读取不必要的列会增加CPU、IO、NET消耗,无法有效利用覆盖指数。易用SELECT*程序BUG(2)禁止在增删字段后使用INSERTINTOt_xxxVALUES(xxx),必须显示指定插入的列属性说明:增删字段后易出现程序BUG(3)禁止使用属性隐式转换解释:SELECTuidFROMt_userWHEREphone=13812345678会造成全表扫描,但无法命中phone索引。猜猜为什么?(这个在线问题出现过不止一次)(4)禁止在WHERE条件的属性上使用函数或表达式格式说明:SELECTuidFROMt_userWHEREfrom_unixtime(day)>='2017-02-15'会导致全表扫描。正确的写法是:SELECTuidFROMt_userWHEREday>=unix_timestamp('2017-02-1500:00:00')(5)禁止否定查询,%开头的模糊查询说明:否定查询条件:NOT,!=,<>,!<,!>,NOTIN,NOTLIKE等,会导致全表扫描。以%开头的模糊查询会导致全表扫描(6)大表禁止使用JOIN查询,大表禁止使用子查询说明:会产生临时表,比较耗内存和CPU,并且大大影响数据库性能(7)禁止OR条件,必须改成IN查询说明:老版本Mysql的OR查询打不到索引。就算能命中索引,为什么数据库还要消耗更多的CPU来帮助实现查询优化呢?(8)应用程序必须捕获SQL异常,并有相应的处理代码,禁止应用程序使用程序配置文件中的账号手动访问在线数据库,禁止非DBA人员对在线数据库进行写操作。修改线上数据,需要提交工单,由DBA执行。提交的SQL语句必须经过测试,并分配给非DBA作为只读帐户。开发、测试、线上环境与库开发、测试、线上环境隔离,必须通过VPN+跳板机接入进行授权
