MySQL优化-表结构设计
2021-11-14 18:03:20 753
- 首先明确一个, 减少占用的存储空间, 可以减少操作时占用的内存, 可以提高CPU处理效率
- 字符串的ip地址可以转换为整数类型存储, mysql提供INET_ATON()和INET_NTOA()进行转换
- 尽量避免字段允许为NULL, 字段为NULL会占用额外空间
- 整数类型可以选择置为无符号, 同样的存储空间, 数值绝对值范围会大一倍
- int(11) 和 int(1)在存储上没有区别
- decimal可以替换为整形, 例: 5.20 可以 替换为 520 存储, mysql在处理decimal的时候, 会需要额外的空间和CPU开销
- VARCHAR为可变字符串, 会额外占用1~2字节存储字符串长度, 具体多少字节取决于字符串长度, 字节存储范围是有限的. 如下情况可以使用VARCHAR存储数据字符串列的最大长度比平均长度大很多列的更新很少
- CHAR是定长的, 所以适用情况大致与VARCHAR是相反的
- 如果非要存储TEXT/BLOG这种大字段, 建议增加子表存储
- 对于有查询性能要求的功能, 应该考虑数据冗余, 例汇总字段/表, 也就是反范式, 例如员工和部门, 员工表除了关联部门id外, 还可以冗余存储部门名称等经常关联查询的字段
- 对于一些需要计数的场景, 比如更新文件下载次数, 可以将其拆分, 以一张独立的表进行存储, 为了提高并发性能, 可以将下载次数分散到100数据行上, 每次hash更新一行, 文件总下载次数就为100行数据的总和
- 禁止使用复杂数据类型(数组,自定义等),Json类型的使用视情况而定
- 需要join的字段(连接键),数据类型必须保持绝对一致,避免隐式转换
- 单表字段数不要太多,建议最多不要大于50个
- MySQL在处理大表时,性能就开始明显降低,所以建议单表物理大小限制在16GB,表中数据行数控制在2000W内