MySQL之数据类型的选择

引用

选择原则

  1. 更小的通常更好
    更小的数据类型通常更快, 因为它们占用更少的磁盘、 内存和CPU缓存, 并且处理时需要的CPU周期也更少。
  2. 简单就好
    简单数据类型的操作通常需要更少的CPU周期。 例如, 整型比字符操作代价更低, 因为字符集和校对规则(排序规则 )使字符比较比整型比较更复杂。
  3. 尽量避免NULL
    如果查询中包含可为NULL 的列, 对MySQL来说更难优化, 因为可为NULL 的列使得索引、 索引统计和值比较都更复杂。 可为NULL的列会使用更多的存储空间, 在MySQL里也需要特殊处理。 当可为NULL的列被索引时, 每个索引记录需要一个额外的字节, 在MyISAM里甚至还可能导致固定大小的索引(例如只有一个整数列的索引)变成可变大小的索引。
    当然也有例外, 例如InnoDB 使用单独的位 (bit) 存储NULL值, 所以对于稀疏数据有很好的空间效率。
  4. 慷慨是不明智的
    使用VARCHAR(5)和VARCHAR(200)存储'hello'的空间开销是一样的。 那么使用更短的列有什么优势吗?
    事实证明有很大的优势。 更长的列会消耗更多的内存, 因为MySQL通常会分配固定大小的内存块来保存内部值。 尤其是使用内存临时表进行排序或操作时会特别糟糕。 在利用磁盘临时表进行排序时也同样糟糕。
    所以最好的策略是只分配真正需要的空间。

数据类型

  1. 整数类型
    存储整数的类型:TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT,分别使用8,16, 24, 32, 64位存储空间。

    • 不允许负值
      整数类型有可选的 UNSIGNED 属性,这大致可以使正数的上限提高一倍,有符号和无符号类型使用相同的存储空间,并具有相同的性能 , 因此可以根据实际情况选择合适的类型。
    • 整数计算一般使用64 位的 BIGINT 整数, 即使在 32 位环境也是如此。
  2. 实数类型
    FLOAT和DOUBLE类型支持使用标准的浮点运算进行近似计算,DECIMAL类型用于存储精确的小数。

    • 浮点类型在存储同样范围的值时, 通常比DECIMAL使用更少的空间。FLOAT使用4个字节存储。DOUBLE占用8个字节,相比FLOAT有更高的精度和更大的范围。和整数类型一样, 能选择的只是存储类型; MySQL使用DOUBLE作为内部浮点计算的类型。
    • 因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用DECIMAL。但在数据最比较大的时候, 可以考虑使用BIGINT代替DECIMAL, 将需要存储的货币单位根据小数的位数乘以相应的倍数即可。
  3. 字符串类型

  • CHAR
    • 定⻓,⻓度范围是1~255
    • 适合:存储很短的字符串,或者所有值接近同一个长度;经常变更,如MD5。
  • VARCHAR
    • 用于存储可变⻓字符串,长度支持到65535
    • 需要使用1或2个额外字节记录字符串的长度
    • 适合:字符串的最大⻓度比平均⻓度⼤很多;更新很少。
  1. BLOB和TEXT类型
    BLOB和 TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储 。
    与其他类型不同, MySQL把每个BLOB和TEXT值当作一个独立的对象处理。 存储引擎在存储时通常会做特殊处理。 当BLOB和TEXT值太大时,InnoDB会使用专门的 “外部“存储区域来进行存储, 此时每个值在行内需要1 - 4个字节存储 存储区域存储实际的值。
    BLOB 和 TEXT 之间仅有的不同是BLOB 类型存储的是二进制数据, 没有排序规则或字符集,而TEXT类型有字符集和排序规则。

  2. 日期和时间类型
    原则是根据实际需求确定类型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容