MySQL数据库设计规范
- 2018-10-17
- 270 人已阅读
命名规范
1、所有数据库对象名称必须使用小写字母,并用下划线分割。
2、所有数据库对象名称禁止使用MySQL保留关键字。
3、数据库命名要见名知意,长度不超过32字符。
4、临时库表必须以tmp为前缀,以日期为后缀。
5、备份库表必须以bak为前缀,并以日期为后缀。
6、所有存储相同数据的列名和列的类型必须一致。
数据库基本设计规范
1、所有数据表使用Innodb存储引擎。(5.6以后Innodb默认的存储引擎,支持事务,行级锁。高并发场景性能好。)
2、数据库和表的字符集统一使用UTF-8。(统一字符集可避免因字符集转换产生的乱码问题)(UTF-8字符集中一个汉字占3个字节)
3、所有表和字段都需要加注释。(从一开始就进行数据字典的维护)
4、尽量控制单表数据量的大小,建议控制在500万行以内。(500万并不是MySQL数据库的限制)
5、谨慎使用MySQL分区表功能。(分区表在物理上表现为多个文件,在逻辑上表现为一个表)
6、尽量做到冷热数据分离,减小表的宽度。(表越宽:1、把表装载进内存缓冲池时所占用的内存越大;2、消耗更多的IO),将经常使用的列放在一个表中。
7、禁止在表中建立预留字段。
8、禁止在数据库中存储图片、文件等二进制数据。
9、禁止在线上做数据库压力测试。
10、禁止从开发环境、测试环境直接连接生成环境数据库。
索引设计规范
1、限制每张表索引数量,建议单张表索引不超过5个
2、每个innodb表必须有一个主键,不适用频繁更新的列为主键 不适用多留主键
3、建议在select update delete语句的where从句中的列中建立索引
4、也可以在包含在order by 、group by distinct中的字段中建立索引
5、在多表JOIN的关联列上建立索引
如何选择索引列的顺序:
1、区分度最高的列放在联合索引的最左侧(尽量选主键)
2、区分度不大的情况下,字段小的列放在联合索引的最左侧
3、以上两点相同的情况下,使用最频繁的列放在联合索引的左侧
4、避免建立重复索引和冗余索引
5、对于频繁的查询,优先考虑覆盖索引(可以避免Innodb表进行索引的二次查找)
6、不建议使用外键约束,但是一定在表与表之间的关联键上建立索引
数据库字段设计规范
优先选择符合存储需要的最小的数据类型(比如将字符串转化为数字类型存储,例如将IP地址转换为整型数据)
对于非负数据采用无符号整型进行存储( unsigned int)
(MySQL中的varchar(N)中的N代表的是字符数,而不是字节数,即varchar(255)是可以保存255个中文的,使用UTF-8字符集存储,varchar(255)=765个字节,因为一个字符占3个字节)
(过大的长度会消耗更多的内存)
避免使用text blob enum类型,一般varcher可以满足要求。如要使用,可以将其分离到单独的扩展表中,在查询时不能使用select * 这样的方式,而只是取出必要的列;而text或blob也只能使用前缀索引,没有默认值
尽量把列定义为not null(因为索引null列需要额外的空间来保存,所以要占用更多的空间)
使用datetime(存储年月日时分秒需要8个字节空间) 或timestamp(存储年月日时分秒需要4个字节空间,但是只能到2038年)类型存储时间(若使用字符串,则需要16个字节空间)。
同财务相关的金额类数据 必须使用decimal类型(精准浮点数据类型)
数据库sql开发规范
建议使用预编译语句进行数据库操作
避免数据类型的隐式转换(隐式转换会导致索引失效)
充分利用表上已经存在的索引:
1、避免使用双%的查询条件 如like %w%
2、一个SQL只能利用到复合索引中的一列进行范围查询
3、使用left join 或not exists来代替not in操作(因为not in通常也会是索引失效)
应该对以后的扩展进行考虑
程序连接不同的数据库使用不同的账号,禁止跨库查询(为数据库迁移和分库分表留出余地、降低业务耦合度、避免因权限过大而产生的安全风险)
禁止使用select *,必须使用select<字段列表>查询。(select *方式查询会消耗更多的CPU和IO以及网络宽带资源、无法使用覆盖索引)
避免使用子查询 可转化为join操作(子查询的结果集无法使用索引,也会产生临时表操作消耗CPU和IO资源,若子查询数量大,严重影响效率)
避免使用join关联太多的表 建议不少过5个
减少同数据库的交互次数
禁止使用 order by rand()进行随机排序(会把表中所有符合条件的数据装载到内存中进行排序,消耗CPU和IO资源)
明显不会有重复值是使用union all代替union(union会把所有数据放到临时表中再进行去重操作)
拆分复杂的大sql为多个小sql(MySQL中一个SQL只能使用一个CPU进行计算,拆分后可以利用多个CPU资源)
数据库操作行为规范
超100万行的批量些操作 要分批多次进行操作
对大表使用pt-online-schema-change修改表结构
禁止为程序使用的账号赋予super权限,遵循权限最小原则,不准有drop权限