MYSQL数据库表设计与优化(二)

决定数据类型的第一步是定义所存数数据的分类: 数值型, 字符串型还是临时型等;除了一些特别的并不是那么直观的外, 这通常是很直观的。

接下来是选择具体的数据类型, 许多mysql的数据类型能存储同一种数据, 但是在可存储的数据范围, 准确度或者存储空间有些不同。 有些数据类型可能还有一些特殊的行为属性。比如, DATETIME和TIMESTAMP都能存储日期和日期, 而且都是准确到秒; 然而, TIMESTAMP占的数据空间只有DATETIME的一半, 而且是时区敏感的,同时有一些自动修改的机制。 另一个方面, 它能表示的数据范围要小些, 有些属性在某些时候是比较麻烦的。

这里只讨论了一些基本的数据类型, 实际上, mysql为了考虑兼容性, 一些数据类型是其他数据类型的别名而已, 例如,INTEGER, BOOl和NUMERIC, 他们是一样的, 只是名字不同而已; 这些数据类型有时候容易叫人困惑, 但倒是多性能的影响不大。

整数

数字分为整数和实数, 如果存储整型数,使用正型数类型:TINYINT, SMALLINT, MEDIUMINT, INT, or BIGINT, 分别是8, 16, 24, 32, 和64位, 能存储的数值范围是–2(N–1) to 2(N–1)–1, 其中N是位数。

整数有一个可选的属性UNSIGNED, 使用这个属性使得无法表示负数, 而可表示的数值上限大体增加了1倍, 比如, TINYINT UNSIGNED 能存储0 到255之间的值, 而不是TINYINT的–128 到 127.

有符号和无符号数使用的数据存数空间是一样的, 性能也差不多, 所以在使用时根据数据范围选择即可。

数据类型的选择通常会影响mysql数据在磁盘,内存中的存储, 然而,正型数的计算通常是以64为的BIGINT进行的,即使是在32位机器上。 (一些统计函数是例外的情况,这些函数通常使用DECIMAL和DOUBLE进行计算 )

mysql允许在选择整型的时候指定一个宽度,如INT(11), 这对于许多应用来说是没有实际意义的:它并不限制值的范围, 只是简单的用来在交互性工具, 比如命令行上指示数值输出的字符宽度。 从存储和计算的角度来看, INT(1)和INT(20)是一样的。

Falcon存储引擎与其他的引起不一样, MySQL AB按照自己的格式来存储整数, 用户多数据的存储大小和格式没有任何控制。一些第三方的存储引擎, 如Brighthouse, 也有自己的存储格式和压缩方法。