字段类型的选择,会直接影响数据库的性能。
- 优先选择符合存储需要的最小的数据类型
- 字段的长度越长,导致索引的长度也会越长
- 将字符串转换为数字类型存储
- INET_ATON(‘255.255.255.255’) = 4294967295
- INET_NTOA(4294967295) = ‘255.255.255.255’
- 对于非负整数的数据,优先使用无符号整型存储
- 无符号比有符号的数据多出一倍的存储空间
- eg:SIGNED INT -2147483648 ~ 2147483647 ; UNSIGNED INT = 4294967295
- VARCHAR(N) 中的N代表的是字符数,而不是字节数
- 使用 UTF8 存储汉字 Varchar(255) = 765个字节
- 过大的长度会消耗更多的内存
- 避免使用 TEXT、BLOB 数据类型
- 建议把 BLOB 或是 TEXT 列分离到单独的扩展表中,且不要使用 SELECT * 这样的查询
- TEXT 或 BLOB 类型只能使用前缀索引
- 避免使用 ENUM 数据类型
- 修改 ENUM 值需要使用 ALTER 语句
- ENUM类型的 ORDER BY 操作效率低,需要额外操作
- ENUM 在进行 ORDER BY 操作时,会将枚举转换为整型进行排序,排序效率低
- 禁止使用数值作为 ENUM 数据类型
- 尽可能把所有列定义为 NOT NULL
- 索引 NULL 列需要额外的空间来保存
- 为 NULL 的列索引,会多出一部分存储空间,用来标识该列是否为空
- 索引空间占用越少越好
- 进行比较和计算时对 NULL 值做特别的处理
- 索引 NULL 列需要额外的空间来保存
- 不建议使用,字符串存储日期型的数据
- 缺点一:无法使用日期函数进行计算和比较
- 缺点二:用字符串存储日期需要占用更多的空间
- 使用字符串存储需要占用 16 个字节
- 而使用日期类型只需要 8 个字节
- 使用 TIMESTAMP 或 DATETIME 类型存储时间
- TIMESTAMP 1970-01-01 ~ 2038-01-19
- TIMESTAMP 占用 4 字节,底层以 INT 存储,但是可读性比 INT 高
- 同财务相关的金额类数据,必须使用 decimal 类型
- Decimal 类型为精准浮点数,在计算时不会丢失精度
- 占用空间由定义的宽度决定
- 可用于存储比 bigint 更大的整型数据
《高性能MySQL》目录
- 第一章 数据库设计规范
- 第二章 数据库字段设计规范
- 第三章 数据库 SQL 开发规范
- 第四章 数据库操作行为规范
- 第五章 设计数据库分区表
- 第六章 MySQL存储引擎
- 第七章 MySQL 执行优化
- 第八章 MySQL 慢查询日志
- 第九章 MySQL 数据库备份与恢复
- 第十章 MySQL构架拆分
- 其他:MySQL表结构实践sql
- 其他2:MySQL常用命令