mysql开发规范(优化)
规范
库名、表名、字段名必须使用小写字母, 并采用下划线分割, 禁止超过32个字符(整齐、易读)
临时库、表名须以tmp加日期为后缀;
使用Innodb存储引擎.【好处: 支持事务和行级锁】
字符集统一使用UTF8mb4【most bytes 4《支持Emoji和全部中文】;
表,字段增加注释,方便后期维护,枚举型标明说明文字.
控制单表字段数量,建议冷热数据分离,大字段分离,提升IO性能;
统一常用字段的含义与使用,比如很多表都会出现创建时间、更新时间、删除时间、软删除字段、状态等等,团队内约定好对应的字段、类型、默认值等等。
不使用视图、外键,而是通过代码多次实现 【视图/外键需要修改地方众多,可读性可迁移性较差】
单表数据量控制在5000w以内,超出要分库分表;
字段选择:
- 字符串: 优先使用varchar,如果长度基本固定的列,如果该列恰好更新又特别频繁,适合char,大文本使用text;
- 数字: 使用tinyint(1)来代替 enum和boolean
- 时间: 推荐使用datetime;
- datetime 和timestamp类型所占的存储空间不同,前者8个字节,后者4个字节,timestamp只能到2038-01-19 11:14:07;
- timestamp类型随时间不同而不同.
索引:
- 个数: 索引个数控制在
5
个以内, 索引在加快访问速度的同时,会增加维护负担,增大IO压力,索引占用空间是成倍增加的 - 主键索引: 一般情况下优先考虑UUID,【考虑UUID和自增id的应用场景】
- 在使用前使用
explain
看能否命中索引; - 组合索引要遵循最左原则: 例如index(‘c1’, ‘c2’, ‘c3’) where ‘c2’ = ‘aaa’ 不使用索引,where
c2
= aaa
and c3
=sss
不能使用索引(如果第一个字段出现 范围符号的查找,那么将不会用到索引,如果是第二个或者第三个字段使用范围符号的查找,那么他会利用索引,利用的索引) https://www.cnblogs.com/chenshishuo/p/5030029.html - 索引字段必须使用 NOT NULL + 默认值的形式,其他的不加NOT NULL对于性能提升影响不大;
SQL语句
- 杜绝直接 SELECT * 读取全部字段,列出要读取的字段;
- 使用where,limit,offset等字段标明范围,尽量避免全表搜索;
- 使用like模糊匹配,%尽量不要放首位,会导致搜索失效;
库名、表名、字段名必须使用小写字母, 并采用下划线分割, 禁止超过32个字符(整齐、易读)
临时库、表名须以tmp加日期为后缀;
使用Innodb存储引擎.【好处: 支持事务和行级锁】
字符集统一使用UTF8mb4【most bytes 4《支持Emoji和全部中文】;
表,字段增加注释,方便后期维护,枚举型标明说明文字.
控制单表字段数量,建议冷热数据分离,大字段分离,提升IO性能;
统一常用字段的含义与使用,比如很多表都会出现创建时间、更新时间、删除时间、软删除字段、状态等等,团队内约定好对应的字段、类型、默认值等等。
不使用视图、外键,而是通过代码多次实现 【视图/外键需要修改地方众多,可读性可迁移性较差】
单表数据量控制在5000w以内,超出要分库分表;
字段选择:
- 字符串: 优先使用varchar,如果长度基本固定的列,如果该列恰好更新又特别频繁,适合char,大文本使用text;
- 数字: 使用tinyint(1)来代替 enum和boolean
- 时间: 推荐使用datetime;
- datetime 和timestamp类型所占的存储空间不同,前者8个字节,后者4个字节,timestamp只能到2038-01-19 11:14:07;
- timestamp类型随时间不同而不同.
索引:
- 个数: 索引个数控制在
5
个以内, 索引在加快访问速度的同时,会增加维护负担,增大IO压力,索引占用空间是成倍增加的 - 主键索引: 一般情况下优先考虑UUID,【考虑UUID和自增id的应用场景】
- 在使用前使用
explain
看能否命中索引; - 组合索引要遵循最左原则: 例如index(‘c1’, ‘c2’, ‘c3’) where ‘c2’ = ‘aaa’ 不使用索引,where
c2
=aaa
andc3
=sss
不能使用索引(如果第一个字段出现 范围符号的查找,那么将不会用到索引,如果是第二个或者第三个字段使用范围符号的查找,那么他会利用索引,利用的索引) https://www.cnblogs.com/chenshishuo/p/5030029.html - 索引字段必须使用 NOT NULL + 默认值的形式,其他的不加NOT NULL对于性能提升影响不大;
- 个数: 索引个数控制在
SQL语句
- 杜绝直接 SELECT * 读取全部字段,列出要读取的字段;
- 使用where,limit,offset等字段标明范围,尽量避免全表搜索;
- 使用like模糊匹配,%尽量不要放首位,会导致搜索失效;
优化
- 大数据量获取全部尽量采用并行分批的方案去做;
- 分页优化: 尽量使用where条件 + limit 替换 offset + limit,
- SQL语句中IN包含的值不应超过200个,如果过多则分批;
- 读写分离;
- 为搜索字段建索引;
- 避免select *, 列出要读取的字段;
扩展