高性能MySQL读书笔记:Schema与数据类型优化
Executive Summary
核心观点(金字塔原理)
结论先行: 良好的Schema设计遵循”更小、更简单、避免NULL”三大原则,合理选择数据类型可显著提升存储效率和查询性能。
支撑论点:
- 整数类型应根据实际数值范围选择最小存储空间(TINYINT到BIGINT)
- 实数类型需权衡精度与性能:DECIMAL精确但开销大,浮点型快但有精度损失
- 字符串类型中VARCHAR适合变长数据,CHAR适合定长数据
SWOT 分析
| 维度 | 分析 |
|---|---|
| S 优势 | 合理的数据类型选择可减少存储空间、提升缓存命中率、加快查询速度 |
| W 劣势 | 过度优化可能导致Schema变更困难;DECIMAL计算开销高于浮点类型 |
| O 机会 | 大数据量场景下类型优化收益明显;财务数据使用BIGINT替代DECIMAL可兼顾精度与性能 |
| T 威胁 | 类型选择不当可能导致数据溢出或精度丢失;NULL值处理增加索引和查询复杂度 |
适用场景
- 新系统数据库Schema设计阶段
- 现有数据库性能优化和重构
- 大数据量表的存储空间优化
Schema与数据类型优化
数据库的设计军规
- 更小的通常更好
- 简单就好
- 尽量避免
NULL
- 整数类型:
TINYINTSMALLINTMEDIUMINTINTBIGINT分别使用8,16,24,32,64位存储空间。它们可以存储的值的范围从-2^(N-1) 到-2^(N-1) - 1,其中N是存储空间的位数。有可选的UNSIGNED属性,表示不允许负值,例如:UNSIGNED可以存储的范围是0 ~ 255,而TINYINT的存储范围是-128 ~ 127。 - 实数类型:指带有小数部分的数字。对于
DECIMAL列,可以指定小数点前后所允许的最大位数,这会影响列的空间消耗。MySQL 5.0和更高的版本将数字打包保存到一个二进制字符串中(每4格字节存储9格数字)。例如:DECIMAL(18,9)小数点两边将个存储9格数字,一共使用9格字节,小数点前后各4各字节,小数点本身占用一个字节。浮点类型在存储同样范围的值时,通常比DECIMAL使用更少的空间。FLOAT使用4个字节存储,DOUBLE占用8个字节,相比FLOAT有更高的精度和更大的范围,MySQL使用DOUBLE作为内部浮点计算的类型。因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用DECIMAL,例如存储财务数据,但在数据量比较大的时候,可以考虑使用BIGINT代替DECIMAL,将需要存储的值乘以小数点后面相应的倍数即可,这样同时避免浮点存储计算的不精确和DECIMAL精确计算代价高的问题。 - 字符串: VARCHAR:用于存储可变长度字符串;CHAR:存储定长字符串