本人个人博客网站,欢迎访问:学教府
一、三个原则
- 更小的通常更好:在符合条件的情况下,选择最小的数据类型更好。因为它们占用更少的磁盘、内存和 CPU 缓存。
- 简单就好:简单的数据类型的操作通常需要更少的 CPU 周期。比如,使用整型存储 IP 地址。
- 尽量避免 NULL:如果查询中包含可为 NULL 的列,对 MySQL 来说更难优化,因为可为 NULL 的列使得索引、索引统计和值比较都更负责。不过一般将 NULL 的列改为非 NULL 性能提升比较小,在对应列建索引时应避免设计为可为 NULL。
二、整数类型
- 存储整数,可以使用的类型及存储空间如下
- 整数类型有可选的 UNSIGNED 属性,表示不允许负值,这基本可以使正数的上限提升一倍
- 整数计算一般使用 64 位的 BIGINT 整数。
- MySQL 可以为整数类型指定宽度,比如 INT(11),对大多数应用来说是没有意义的,对于存储来说也没有影响。
三、实数类型
- 可以使用 DECIMAL 存储比 BIGINT 还大的整数。
- DECIMAL 用于存储精确的小数,并能进行精确计算。
- DECIMAL 类型可以指定精度。存储占用是每 4 个字节存 9 个数字。比如 DECIAML(18,9)小数点两边个存储 9 个数字,一共占用 9 个字节:小数点前后数字各用 4 个字节,小数点本身占 1 个字节。
- DECIMAL 只是一种存储格式,在计算时会转换为 DOUBLE 类型。并且 DECIMAL 占用空间比 FLOAT 和 DOUBLE 大,如果只是存储不计算,可以使用 FLOAT。
- 数据量大的情况下,可以使用 BIGINT 替代,进行相应位数的乘除倍数就行,存储比 DECIMAL 小,计算精确。
四、VARCHAR 和 CHAR 类型
- varchar
① varchar 是变长的,比定长更节省空间,因为它仅使用必要的空间。
② varchar 需要使用 1 或 2 个额外字节记录字符串的长度。如果列长 <= 255 个字节,使用 1 个字节记录长度,否则使用 2 个字节。
③ InnoDB 会把过长的 VARCHAR 类型存储为 BLOB - char
① char 类型是定长的。当存储 char 值时, MySQL 会删除所有的末尾空格
② char 适合存储很短的字符串,或所有值都接近同一个长度 - 两者使用区别
① 对于经常变更的列,使用 char 更好,因为定长的 char 不容易产生碎片,而 varchar 容易产生。
② 对于非常短的列,适合 char ,因为使用 varchar 还是多个字节存储长度
③ 使用 UTF-8 这样的字符集,适合 varchar 变长存储
④ 注意: 使用 varchar 时,比如 varchar(5) 和 varchar (100) 都能满足时,最好使用短的。因为虽然存储时只使用了具体值大小的空间,但是在使用内存临时表进行操作时会很糟糕,Memory 引擎只支持定长的行,变长字段也会根据最大长度分配。 - 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:
varchar 类型的 varchar_col:
④. 结论:char 类型存储字符会剔除末尾的空格,而 varchar 存储会保留所有字符。