首页 » 读书笔记 » 《高性能MySQL》——选择优化的数据类型

《高性能MySQL》——选择优化的数据类型

数据类型的选择原则

  • 更小的通常更好
  • 简单就好
  • 尽量避免NULL 索引、索引统计和值比较都更为复杂;会使用更多的存储空间;当为索引时,每个索引记录都需要一个额外的字节;

整型

tinyint:8位;(256)

smallint:16位;(65536)

mediumint:24位;(1677 7216)

int:32位;(42 9496 7296)

bigint:64位;(1844 6744 0737 0955 1616)

有符号和无符号类型使用相同的存储空间,并具有相同的性能。

可以为整数类型指定宽度,比如 int(11),对大多数应用这是没有意义的:它不会限制值的合法范围,只是规定了MySQL的一些交互工具用来显示字符的个数。

实数

decimal 类型用于存储精确的小数。在 MySQL 5.0 和更高的版本,decimal 类型支持精确计算,而在 MySQL 4.1 以及更早版本则使用浮点运算来实现 decimal 的计算。

因为CPU不支持对 decimal 的直接计算,所以 MySQL 服务器自身实现了 decimal 的高精度计算。所以浮点运算明显比 decimal 更快。

decimal 最多允许 65个数字。

字符串类型

varchar 和 char 类型

varchar

varchar 需要使用 1 或 2 个额外字节记录字符串的长度:如果列的最大长度 小于等于 255 字节,则只使用一个字节来表示,否则使用2个字节。例:varchar(10) 需要 11 个字节的存储空间,varchar(1000) 则需要 1002 个字节。

char

MySQL 总是根据定义的字符串分配足够的空间。当存储char值时,MySQL会删除所有的末尾空格(MySQL 4.1 和更老的版本中,varchar也是这样实现的。)

char 不容易产生碎片。

blob 和 text 类型

分别采用二进制和字符方式存储。

与其他类型不同,MySQL 把每个 blob 和 text 当作一个独立的对象处理。存储引擎在存储时通常会做特殊处理。当 blob 和 text 值太大时,InnoDB 会使用专门的“外部”存储区域来进行存储,此时每个值在行内需要 1~ 4 个字节存储一个指针,然后在外部存储区域存储实际的值。

MySQL 对 blob 和 text 列进行排序与其他类型是不同的:它只对每个列的最前 max_sort_length 字节而不是整个字符串都做排序。

MySQL 不能将blob 和 text 列全部长度的字符串进行索引,也不能使用这些索引消除排序。

使用枚举代替字符串类型

枚举存储的是整数。

添加或删除字符串必须使用 ALTER TABLE。对于一系列未来可能会改变的字符串,使用枚举不是一个好主意,除非能接受只在列表末尾添加元素,这样就不用重建整个表来完成修改。

在特定情况下,把 char/varchar 列与枚举列进行关联可能会比直接关联 char/varchar 列更慢。

在做比较操作时转为字符串。

日期和时间类型

MySQL 能存储的最小时间粒度为秒。

datetime

能保存大范围的值,从 1001 年到 9999 年,精度为秒。使用 8 个字节的存储空间

默认情况下,MySQL 以一种可排序的、无歧义的格式显示 datetime值。

timestamp

只是用 4 个字节的存储空间,范围只能表示从 1970 年到 2038 年。

timestamp 有 datetime 没有的特殊属性。默认情况下,如果插入时没有指定第一个 timestamp 列的值,MySQL 则设置这个列的值为当前时间(它的行为规则比较复杂,应且在不用版本里会变动,需要自己验证)。在插入一行记录时,MySQL 默认也会更新第一个 timestamp列的值(除非在 update 语句中明确指定了值)。可以配置任何默认行为。

timestamp 列默认值为 not null。

原文链接:《高性能MySQL》——选择优化的数据类型,转载请注明来源!

0