转载自https://github.com/Snailclimb/JavaGuide(添加小部分笔记)感谢作者!
索引优化相关
- in 代替 or
- not exist 代替 not in
数据库命名规范#
- 所有数据库对象名称必须使用小写字母并用下划线分割
- 所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)
- 数据库对象的命名要能做到见名识意,并且最好不要超过 32 个字符
- 临时库表必须以
tmp_为前缀并以日期为后缀,备份表必须以bak_为前缀并以日期 (时间戳) 为后缀 - 所有存储相同数据的列名和列类型必须一致(一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低)
数据库基本设计规范#
所有表必须使用InnoDB存储引擎#
- 没有特殊要求(即 InnoDB 无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用 InnoDB 存储引擎(MySQL5.5 之前默认使用 Myisam,5.6 以后默认的为 InnoDB)。
- InnoDB 支持事务,支持行级锁,更好的恢复性,高并发下性能更好
数据库和表的字符集统一使用UTF-8#
兼容性更好,统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效,如果数据库中有存储 emoji 表情的需要,字符集需要采用 utf8mb4 字符集。
参考文章:
- MySQL 字符集不一致导致索引失效的一个真实案例open in new window
- [MySQL 字符集详解
所有表和字段都需要添加注释#
使用 comment 从句添加表和列的备注,从一开始就进行数据字典的维护
尽量控制单表数据量的大小,建议控制在500万以内#
500 万并不是 MySQL 数据库的限制,过大会造成修改表结构,备份,恢复都会有很大的问题。
可以用历史数据归档(应用于日志数据),**分库分表(应用于业务数据)**等手段来控制数据量大小
谨慎使用MySQL分区表#
分区表在物理上表现为多个文件,在逻辑上表现为一个表;
谨慎选择分区键,跨分区查询效率可能更低;
建议采用物理分表的方式管理大数据。
经常一起使用的列放到一个表中#
避免更多的关联操作。











