-
首先明确一个, 减少占用的存储空间, 可以减少操作时占用的内存, 可以提高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内
注意: 本文归作者所有, 未经作者允许, 不得转载. 若有谬误, 欢迎指出