《高性能MySQL》第二章 数据库字段设计规范

字段类型的选择,会直接影响数据库的性能。

  1. 优先选择符合存储需要的最小的数据类型
    1. 字段的长度越长,导致索引的长度也会越长
    2. 将字符串转换为数字类型存储
      1. INET_ATON(‘255.255.255.255’) = 4294967295
      2. INET_NTOA(4294967295) = ‘255.255.255.255’
    3. 对于非负整数的数据,优先使用无符号整型存储
      1. 无符号比有符号的数据多出一倍的存储空间
      2. eg:SIGNED INT -2147483648 ~ 2147483647 ; UNSIGNED INT = 4294967295
    4. VARCHAR(N) 中的N代表的是字符数,而不是字节数
    5. 使用 UTF8 存储汉字 Varchar(255) = 765个字节
    6. 过大的长度会消耗更多的内存
  2. 避免使用 TEXT、BLOB 数据类型
    1. 建议把 BLOB 或是 TEXT 列分离到单独的扩展表中,且不要使用 SELECT * 这样的查询
    2. TEXT 或 BLOB 类型只能使用前缀索引
  3. 避免使用 ENUM 数据类型
    1. 修改 ENUM 值需要使用 ALTER 语句
    2. ENUM类型的 ORDER BY 操作效率低,需要额外操作
      1. ENUM 在进行 ORDER BY 操作时,会将枚举转换为整型进行排序,排序效率低
    3. 禁止使用数值作为 ENUM 数据类型
  4. 尽可能把所有列定义为 NOT NULL
    1. 索引 NULL 列需要额外的空间来保存
      1. 为 NULL 的列索引,会多出一部分存储空间,用来标识该列是否为空
      2. 索引空间占用越少越好
    2. 进行比较和计算时对 NULL 值做特别的处理
  5. 不建议使用,字符串存储日期型的数据
    1. 缺点一:无法使用日期函数进行计算和比较
    2. 缺点二:用字符串存储日期需要占用更多的空间
      1. 使用字符串存储需要占用 16 个字节
      2. 而使用日期类型只需要 8 个字节
  6. 使用 TIMESTAMP 或 DATETIME 类型存储时间
    1. TIMESTAMP 1970-01-01 ~ 2038-01-19
    2. TIMESTAMP 占用 4 字节,底层以 INT 存储,但是可读性比 INT 高
  7. 同财务相关的金额类数据,必须使用 decimal 类型
    1. Decimal 类型为精准浮点数,在计算时不会丢失精度
    2. 占用空间由定义的宽度决定
    3. 可用于存储比 bigint 更大的整型数据

《高性能MySQL》目录

  1. 第一章 数据库设计规范
  2. 第二章 数据库字段设计规范
  3. 第三章 数据库 SQL 开发规范
  4. 第四章 数据库操作行为规范
  5. 第五章 设计数据库分区表
  6. 第六章 MySQL存储引擎
  7. 第七章 MySQL 执行优化
  8. 第八章 MySQL 慢查询日志
  9. 第九章 MySQL 数据库备份与恢复
  10. 第十章 MySQL构架拆分
  11. 其他:MySQL表结构实践sql
  12. 其他2:MySQL常用命令
文章作者: koral
文章链接: http://luokaiii.github.io/2019/06/23/读书笔记/《高性能MySQL》/2.数据库字段设计规范/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自