此文章是自己阅读阿里java开发手册、查看网上资源以及自己实际项目下编写
- 表名统一使用t_开头,字体全部使用小写,多单词间使用下划线“_”分隔,不超过32个字符。表名加上中文注释!
- 字段规则为‘驼峰命名法’,应该和Entity字段对应,不超过32个字符,禁止使用无关单词、汉语拼音!字段必须加上中文注释!
- 必须建主键,若无特殊说明,id通常为自增主键。
- 统一使用InnDB存储引擎。
- 字符集使用UTF8MB4,它是utf8的超集。
- 禁止使用存储过程、视图、触发器、UDF(即自定义函数)等(此条仅适用于后台程序,DBA等维护统计与后台程序无关的酌情)。
- 不要存储大文件或者图片,存url或使用NAS什么的多好。
- 单实例表数目不多于500个。
- 单表列小于30个。
- 禁止使用外键,外键会影响性能,只需要在程序控制就行(随着数据的增长,插入一条数据都需要做验证导致程序越来越慢)。
- 字段应尽量满足NOT NULL并提供默认值,禁止使用非索引列作为检索条件进行update、delete等修改数据操作(inndb的锁锁了什么)。
- 禁止使用text、blob类型,会浪费更多的磁盘和内存空间,非必要的大量的大字段查询会淘汰掉热数据,导致内存命中率急剧降低,影响数据库性能。
- 禁止使用小数存储货币,货币使用整数
- 字段长度尽量取小,如手机号varchar(20)足够满足区号或国家号,或者干脆varchar(11)
- 不要用枚举类型,使用tinyint,枚举会增加DDL操作,况且枚举本来存储的tinyint
- 单表索引不超过5个,太多增加插入数据重排的性能消耗,实际上已经达不到有效的过滤数据的效果。
- 在更新频繁,区分度不高的字段上建索引是没有意义的,频繁更新索引会严重降低性能
- 组合索引将区分度高的字段放在最左边,能更加有意义的过滤数据
- 禁止使用隐式转换,例如select id from user where age=’22’,会导致全表扫描
- 禁止在where条件字段使用函数表达式,例如select id from user where to_char(createDate)<’2016-10-01’,应修改为select id from user where createDate<to_date(’2016-10-01 00:00:00’)
- 禁止使用负向查询,以及使用%开头的模糊查询,负向查询NOT、!= 、<> 、!< 、!>、NOT IN、NOT LIKE等,会导致全表扫描
- 禁止大表使用JOIN,使用子查询,会产生临时表,消耗较多的内存与CPU,极大影响数据库性能
- 应该用IN条件代替OR条件(IN的二分查找优化)
- 【推荐】如果有 order by 的场景,请注意利用索引的有序性。order by 最后的字段是组合索引的一部分,并且放在索引组合顺序的最后,避免出现 file_sort 的情况,影响查询性能。正例:where a=? and b=? order by c; 索引:a_b_c