MySQL数据类型的选择
MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。
下面几个简单的原则有助于做出更好的选择。
一、越小越好
更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU。
(1)char比varchar更好
char是定长的,适合存储很短的字符串,或者所有值都接近同一个长度,例如MD5值。对于经常变更的数据,定长的char类型不容易产生碎片,在空间存储上也比varchar更有效率。
varchar类型用于存储可变长字符串,比char更节省空间。varchar需要使用1或2个额外字节记录字符串长度,如果列的最大长度小于或等于255字节,则使用1个字节表示,否则使用2个。假设采用latin1字符集,varchar(10)需要11个字节的存储空间,varchar(1000)需要1002个字节。当字符串列的最大长度比平均长度大很多,更新的列很少,通常都用varchar。
(2)tinyint比int更好
tinyint使用8位存储空间,可以存储的值的范围从-2n-1 ~ 2n-1-1,n为存储空间的位数,即-128 ~ 127,如果使用选择UNSIGNED属性,则范围是0 ~ 255。
int使用32位存储空间,可以存储的值的范围是-2147483648 ~ 2147483647。
MySQL可以为整数类型指定宽度,如int(11),不过对大多数应用来说这是没有意义的,它不会限制整型的合法范围,只是用来显示。对于存储和计算来说,int(1)和int(11)是相同的。
(3)timestamp比datetime更好
timestamp使用4个字节的存储空间,表示从1970年到2038年。
datetime使用8个字节的存储空间,表示从1001年到9999年。
也有人会使用int类型(4个字节)存储Unix时间戳作为时间类型,这样做的好处是在InnoDB引擎建立索引的情况下查询效率最高。
二、越简单越好
简单的数据类型操作通常需要更少的CPU周期。例如,整型比字符操作代价更低,因为字符集和排序规则使字符比较比整型比较更复杂。所以能用整型的就不要用字符串,能用MySQL内建的类型,就不要用字符串。例如,可以用int类型来存储IP地址,对于固定不变的字符串可以用enum来替代char或者varchar。如ON/OFF、f/m或者星期、月份的英文缩写等,使用枚举类型的好处是节省空间、阅读性强、列与列之间关联快。缺点是使用数字作为枚举常量会导致混乱、枚举字段是按照内部存储的整数排序的而不是定义的字符串。
三、避免NULL
如果查询中包含可为NULL的列,对MySQL来说更难优化。因为可为NULL的列使得索引、索引统计和值比较都更复杂,同时也会使用更多的存储空间。
BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。BLOB没有排序规则或字符集,而TEXT有。MySQL不能将BLOB和TEXT列全部长度的字符串进行索引,也不能使用这些索引消除排序。
参考资料:《高性能MySQL第三版》