选择数据类型只要遵循小而简单的原则就好,越小的数据类型通常会更快,占用更少的磁
盘、内存,处理时需要的
CPU
周期也更少。越简单的数据类型在计算时需要更少的
CPU
周期,比如,整型就比字符操作代价低,因而会使用整型来存储
ip
地址,使用
DATETIME
来存储时间,而不是使用字符串。
这里总结几个可能容易理解错误的技巧:
1.
通常来说把可为
NULL
的列改为
NOT NULL
不会对性能提升有多少帮助,只是如
果计划在列上创建索引,就应该将该列设置为
NOT NULL
。
2.
对整数类型指定宽度,比如
INT(11)
,没有任何卵用。
INT
使用
32
位(
4
个字
节)存储空间,那么它的表示范围已经确定,所以
INT(1)
和
INT(20)
对于存储和计算是相
同的。
3. UNSIGNED
表示不允许负值,大致可以使正数的上限提高一倍。比如
TINYINT
存
储范围是
-128 ~ 127
,而
UNSIGNED TINYINT
存储的范围却是
0 - 255
。
4.
通常来讲,没有太大的必要使用
DECIMAL
数据类型。即使是在需要存储财务数据
时,仍然可以使用
BIGINT
。比如需要精确到万分之一,那么可以将数据乘以一百万然后
使用
BIGINT
存储。这样可以避免浮点数计算不准确和
DECIMAL
精确计算代价高的问题。
5. TIMESTAMP
使用
4
个字节存储空间,
DATETIME
使用
8
个字节存储空间。因而,
TIMESTAMP
只 能 表 示
1970 - 2038
年 , 比
DATETIME
表 示 的 范 围 小 得 多 , 而 且
TIMESTAMP
的值因时区不同而不同。
6.
大多数情况下没有使用枚举类型的必要,其中一个缺点是枚举的字符串列表是固定
的,添加和删除字符串(枚举选项)必须使用
ALTER TABLE
(如果只只是在列表末尾追
加元素,不需要重建表)。
7. schema
的列不要太多。原因是存储引擎的
API
工作时需要在服务器层和存储引擎
层之间通过行缓冲格式拷贝数据,然后在服务器层将缓冲内容解码成各个列,这个转换过
程的代价是非常高的。如果列太多而实际使用的列又很少的话,有可能会导致
CPU
占用过
高。
8.
大表
ALTER TABLE
非常耗时,
MySQL
执行大部分修改表结果操作的方法是用新
的结构创建一个张空表,从旧表中查出所有的数据插入新表,然后再删除旧表。尤其当内
存不足而表又很大,而且还有很大索引的情况下,耗时更久。当然有一些奇技淫巧可以解
决这个问题,有兴趣可自行查阅。
评论