引用
选择原则
- 更小的通常更好
更小的数据类型通常更快, 因为它们占用更少的磁盘、 内存和CPU缓存, 并且处理时需要的CPU周期也更少。 - 简单就好
简单数据类型的操作通常需要更少的CPU周期。 例如, 整型比字符操作代价更低, 因为字符集和校对规则(排序规则 )使字符比较比整型比较更复杂。 - 尽量避免NULL
如果查询中包含可为NULL 的列, 对MySQL来说更难优化, 因为可为NULL 的列使得索引、 索引统计和值比较都更复杂。 可为NULL的列会使用更多的存储空间, 在MySQL里也需要特殊处理。 当可为NULL的列被索引时, 每个索引记录需要一个额外的字节, 在MyISAM里甚至还可能导致固定大小的索引(例如只有一个整数列的索引)变成可变大小的索引。
当然也有例外, 例如InnoDB 使用单独的位 (bit) 存储NULL值, 所以对于稀疏数据有很好的空间效率。 - 慷慨是不明智的
使用VARCHAR(5)和VARCHAR(200)存储'hello'的空间开销是一样的。 那么使用更短的列有什么优势吗?
事实证明有很大的优势。 更长的列会消耗更多的内存, 因为MySQL通常会分配固定大小的内存块来保存内部值。 尤其是使用内存临时表进行排序或操作时会特别糟糕。 在利用磁盘临时表进行排序时也同样糟糕。
所以最好的策略是只分配真正需要的空间。
数据类型
-
整数类型
存储整数的类型:TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT,分别使用8,16, 24, 32, 64位存储空间。- 不允许负值
整数类型有可选的 UNSIGNED 属性,这大致可以使正数的上限提高一倍,有符号和无符号类型使用相同的存储空间,并具有相同的性能 , 因此可以根据实际情况选择合适的类型。 - 整数计算一般使用64 位的 BIGINT 整数, 即使在 32 位环境也是如此。
- 不允许负值
-
实数类型
FLOAT和DOUBLE类型支持使用标准的浮点运算进行近似计算,DECIMAL类型用于存储精确的小数。- 浮点类型在存储同样范围的值时, 通常比DECIMAL使用更少的空间。FLOAT使用4个字节存储。DOUBLE占用8个字节,相比FLOAT有更高的精度和更大的范围。和整数类型一样, 能选择的只是存储类型; MySQL使用DOUBLE作为内部浮点计算的类型。
- 因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用DECIMAL。但在数据最比较大的时候, 可以考虑使用BIGINT代替DECIMAL, 将需要存储的货币单位根据小数的位数乘以相应的倍数即可。
字符串类型
- CHAR
- 定⻓,⻓度范围是1~255
- 适合:存储很短的字符串,或者所有值接近同一个长度;经常变更,如MD5。
- VARCHAR
- 用于存储可变⻓字符串,长度支持到65535
- 需要使用1或2个额外字节记录字符串的长度
- 适合:字符串的最大⻓度比平均⻓度⼤很多;更新很少。
BLOB和TEXT类型
BLOB和 TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储 。
与其他类型不同, MySQL把每个BLOB和TEXT值当作一个独立的对象处理。 存储引擎在存储时通常会做特殊处理。 当BLOB和TEXT值太大时,InnoDB会使用专门的 “外部“存储区域来进行存储, 此时每个值在行内需要1 - 4个字节存储 存储区域存储实际的值。
BLOB 和 TEXT 之间仅有的不同是BLOB 类型存储的是二进制数据, 没有排序规则或字符集,而TEXT类型有字符集和排序规则。日期和时间类型
原则是根据实际需求确定类型。