高性能MySQL读书笔记:Schema与数据类型优化

Executive Summary

核心观点(金字塔原理)

结论先行: 良好的Schema设计遵循”更小、更简单、避免NULL”三大原则,合理选择数据类型可显著提升存储效率和查询性能。

支撑论点:

  1. 整数类型应根据实际数值范围选择最小存储空间(TINYINT到BIGINT)
  2. 实数类型需权衡精度与性能:DECIMAL精确但开销大,浮点型快但有精度损失
  3. 字符串类型中VARCHAR适合变长数据,CHAR适合定长数据

SWOT 分析

维度 分析
S 优势 合理的数据类型选择可减少存储空间、提升缓存命中率、加快查询速度
W 劣势 过度优化可能导致Schema变更困难;DECIMAL计算开销高于浮点类型
O 机会 大数据量场景下类型优化收益明显;财务数据使用BIGINT替代DECIMAL可兼顾精度与性能
T 威胁 类型选择不当可能导致数据溢出或精度丢失;NULL值处理增加索引和查询复杂度

适用场景

  • 新系统数据库Schema设计阶段
  • 现有数据库性能优化和重构
  • 大数据量表的存储空间优化

Schema与数据类型优化

数据库的设计军规
  • 更小的通常更好
  • 简单就好
  • 尽量避免NULL
  1. 整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT分别使用8,16,24,32,64位存储空间。它们可以存储的值的范围从-2^(N-1) 到-2^(N-1) - 1,其中N是存储空间的位数。有可选的UNSIGNED属性,表示不允许负值,例如:UNSIGNED可以存储的范围是0 ~ 255,而TINYINT的存储范围是-128 ~ 127。
  2. 实数类型:指带有小数部分的数字。对于DECIMAL列,可以指定小数点前后所允许的最大位数,这会影响列的空间消耗。MySQL 5.0和更高的版本将数字打包保存到一个二进制字符串中(每4格字节存储9格数字)。例如: DECIMAL(18,9)小数点两边将个存储9格数字,一共使用9格字节,小数点前后各4各字节,小数点本身占用一个字节。浮点类型在存储同样范围的值时,通常比DECIMAL使用更少的空间。FLOAT使用4个字节存储,DOUBLE占用8个字节,相比FLOAT有更高的精度和更大的范围,MySQL使用DOUBLE作为内部浮点计算的类型。因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用DECIMAL,例如存储财务数据,但在数据量比较大的时候,可以考虑使用BIGINT代替DECIMAL,将需要存储的值乘以小数点后面相应的倍数即可,这样同时避免浮点存储计算的不精确和DECIMAL精确计算代价高的问题。
  3. 字符串: VARCHAR:用于存储可变长度字符串;CHAR:存储定长字符串