数据类型的选择原则
- 更小的通常更好
- 简单就好
- 尽量避免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》——选择优化的数据类型,转载请注明来源!