阿林的博客
昨夜梦 今辰你 明日思 | Blog about life and learning.

【读书笔记】《高性能MySQL》第四章:选择优化的数据类型

  February 15, 2020 读书笔记    高性能MySQL   

1. 选择优化的数据类型

选择数据类型的原则

数字分为:整数实数

1.1 整数类型

整数可以用:TINYINT、SMALLINT、INT、BIGINT类型来存储,分别占用8、16、24、32、64位的存储空间. 使用UNSIGNED属性标识整数,表示不可为负:

MySQL可以为整数类型指定宽度,例如INT(11),对于大多数应用是没有意义的,他不会限制值的合法范围,只是规定了MySQL的客户端来显示字符的个数,对于存储来说INT(11)和INT(20)占用的空间是相同的.

1.2 实数类型

实数是带有小数部分的数字,实数类型也不一定是用来存小数,可以用decimal来存储比bigint还大的整数.

MySQL既支持精确类型也支持不精确类型:

许多方法可以指定浮点列的精度,这样MySQL会悄悄使用不同的数据类型,或者在存储时进行取舍,因此建议只指定数据类型而不指定精度.鉴于空间和计算开销,应该只在对小数进行计算的场景下才使用decimal.

1.3 字符串类型
1.3.1 varchar
1.3.2 char
1.3.3 blob和text类型
1.3.4 使用枚举类型代替字符串
mysql>create table enum_test(
	e ENUM('fish','apple','dog')not null
);
mysql> insert into enum_test(e)values('fish','dog','apple');

这三行数据实际上存储为整数:

mysql> select e+0 from enum_test;

+---+
|e+0|
+---+
|  1|
|  3|
|  2|
+---+
1.4 日期和时间类型

MySQL能存储的最小时间单位是秒,但是也可以使用微秒级别的粒度进行临时运算.

1.4.1 DATETIME
1.4.2 TIMESTAMP

此外,可以用bigint来保存更小粒度的时间值

1.5 位数据类型

​ MySQL之后少数的类型使用位来存储数据,例如bit和set而不管底层储存格式和方式如何,从技术上来说都是字符串.

1.6 选择标识符

标识列可能被用来与其他列比较,或者通过标识列寻找其他列,标识列也可能被用在外键.

在满足值的范围,并且保证未来的增长空间时应选择最小的 数据类型来作为标识列的类型:

2.MySQL在schema中设计中的陷阱

3.范式和反范式

在范式化的数据库中所有数据出现且仅出现一次,而反范式的数据中,每个事实数据可能会出现多次,信息冗余.

3.1 范式的优点和缺点

写密集型的表按照范式规范设计性能会更好!

3.2反范式的优点和缺点
3.3 混用范式和反范式

4.缓存表和汇总表

有时候提升性能最好的方法是在表中保存一写衍生的冗余的数据,但在某些时候,也需要创建一张完全的汇总表或者缓存表.

5.总结

  • 尽量避免过度设计
  • 使用小和简单的合适数据类型,尽量避免使用null值
  • 尽量使用相同的数据类型存储相似或者相关的列,尤其是关联条件中的列
  • 注意可变长字符串
  • 尽量使用整型定义标识列
  • 避免使用MySQL已经遗弃的特性
  • 小心的使用枚举和set,最好避免使用bit
  • 范式是好的,但是很多时候反范式也是有必要的,这回带来好处




如果有任何问题请联系我:troylin0218@gmail.com
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文连接: https://troylin0218.github.io/High_Performance_MySQL-Section_4-1.html

Powered by Jekyll · Theme based on solid and Randy's Blog
Made with ❤️ by TianLin