MySQL优化-表结构设计

kyaa111 2年前 ⋅ 631 阅读
  1. 首先明确一个, 减少占用的存储空间, 可以减少操作时占用的内存, 可以提高CPU处理效率

  2. 字符串的ip地址可以转换为整数类型存储, mysql提供INET_ATON()和INET_NTOA()进行转换

  3. 尽量避免字段允许为NULL, 字段为NULL会占用额外空间

  4. 整数类型可以选择置为无符号, 同样的存储空间, 数值绝对值范围会大一倍

  5. int(11) 和 int(1)在存储上没有区别

  6. decimal可以替换为整形, 例: 5.20 可以 替换为 520 存储, mysql在处理decimal的时候, 会需要额外的空间和CPU开销

  7. VARCHAR为可变字符串, 会额外占用1~2字节存储字符串长度, 具体多少字节取决于字符串长度, 字节存储范围是有限的. 如下情况可以使用VARCHAR存储数据

    1. 字符串列的最大长度比平均长度大很多

    2. 列的更新很少

  8. CHAR是定长的, 所以适用情况大致与VARCHAR是相反的

  9. 如果非要存储TEXT/BLOG这种大字段, 建议增加子表存储

  10. 对于有查询性能要求的功能, 应该考虑数据冗余, 例汇总字段/表, 也就是反范式, 例如员工和部门, 员工表除了关联部门id外, 还可以冗余存储部门名称等经常关联查询的字段

  11. 对于一些需要计数的场景, 比如更新文件下载次数, 可以将其拆分, 以一张独立的表进行存储, 为了提高并发性能, 可以将下载次数分散到100数据行上, 每次hash更新一行, 文件总下载次数就为100行数据的总和

  12. 禁止使用复杂数据类型(数组,自定义等),Json类型的使用视情况而定

  13. 需要join的字段(连接键),数据类型必须保持绝对一致,避免隐式转换

  14. 单表字段数不要太多,建议最多不要大于50个

  15. MySQL在处理大表时,性能就开始明显降低,所以建议单表物理大小限制在16GB,表中数据行数控制在2000W内