MySQL(1)——数据类型的选择(一)

一、三个原则

  1. 更小的通常更好:在符合条件的情况下,选择最小的数据类型更好。因为它们占用更少的磁盘、内存和 CPU 缓存。
  2. 简单就好:简单的数据类型的操作通常需要更少的 CPU 周期。比如,使用整型存储 IP 地址。
  3. 尽量避免 NULL:如果查询中包含可为 NULL 的列,对 MySQL 来说更难优化,因为可为 NULL 的列使得索引、索引统计和值比较都更负责。不过一般将 NULL 的列改为非 NULL 性能提升比较小,在对应列建索引时应避免设计为可为 NULL。

二、整数类型

  1. 存储整数,可以使用的类型及存储空间如下
    存储整数的类型和占用空间
  2. 整数类型有可选的 UNSIGNED 属性,表示不允许负值,这基本可以使正数的上限提升一倍
  3. 整数计算一般使用 64 位的 BIGINT 整数。
  4. MySQL 可以为整数类型指定宽度,比如 INT(11),对大多数应用来说是没有意义的,对于存储来说也没有影响。

三、实数类型

  1. 可以使用 DECIMAL 存储比 BIGINT 还大的整数。
  2. DECIMAL 用于存储精确的小数,并能进行精确计算。
  3. DECIMAL 类型可以指定精度。存储占用是每 4 个字节存 9 个数字。比如 DECIAML(18,9)小数点两边个存储 9 个数字,一共占用 9 个字节:小数点前后数字各用 4 个字节,小数点本身占 1 个字节。
  4. DECIMAL 只是一种存储格式,在计算时会转换为 DOUBLE 类型。并且 DECIMAL 占用空间比 FLOAT 和 DOUBLE 大,如果只是存储不计算,可以使用 FLOAT。
  5. 数据量大的情况下,可以使用 BIGINT 替代,进行相应位数的乘除倍数就行,存储比 DECIMAL 小,计算精确。

四、VARCHAR 和 CHAR 类型

  1. varchar
    ① varchar 是变长的,比定长更节省空间,因为它仅使用必要的空间。
    ② varchar 需要使用 1 或 2 个额外字节记录字符串的长度。如果列长 <= 255 个字节,使用 1 个字节记录长度,否则使用 2 个字节。
    ③ InnoDB 会把过长的 VARCHAR 类型存储为 BLOB
  2. char
    ① char 类型是定长的。当存储 char 值时, MySQL 会删除所有的末尾空格
    ② char 适合存储很短的字符串,或所有值都接近同一个长度
  3. 两者使用区别
    ① 对于经常变更的列,使用 char 更好,因为定长的 char 不容易产生碎片,而 varchar 容易产生。
    ② 对于非常短的列,适合 char ,因为使用 varchar 还是多个字节存储长度
    ③ 使用 UTF-8 这样的字符集,适合 varchar 变长存储
    注意: 使用 varchar 时,比如 varchar(5) 和 varchar (100) 都能满足时,最好使用短的。因为虽然存储时只使用了具体值大小的空间,但是在使用内存临时表进行操作时会很糟糕,Memory 引擎只支持定长的行,变长字段也会根据最大长度分配。
  4. varchar 和 char 对行尾空格的处理
    ①. 创建表
    -- 建表
    CREATE TABLE `char_test` (
      char_col CHAR(10) COMMENT 'char类型',
      varchar_col VARCHAR(10) COMMENT 'varchar类型'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    -- 插入数据
    insert into char_test(char_col, varchar_col) VALUE ('string1','string1'),(' string2',' string2'),('string3 ','string3 ');
    
    ②. 查询
    select CONCAT("'",char_col,"'") as char_col from char_test;
    select CONCAT("'",varchar_col,"'") as varchar_col from char_test;
    
    ③. 结果
    char 类型的 char_col:
    char_col
    varchar 类型的 varchar_col:
    varchar_col
    ④. 结论:char 类型存储字符会剔除末尾的空格,而 varchar 存储会保留所有字符。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章