1. 数据类型
1.1 基本类型表格
类型 | 长度(bytes) | 描述 |
---|---|---|
CHAR | 0-255 | 定长字符串 |
VARCHAR | 0-65535 | 变长字符串 |
TINYBLOB | 0-255 | 二进制变长字符串 |
TINYTEXT | 文本变长字符串 | |
BLOB | 0-65535 | |
TEXT | ||
MEDIUMBLOB | 0-16777215 | |
MEDIUMTEXT | ||
LONGBLOB | 0-4294967295 | |
LONGTEXT |
1.2 varchar与char类型
- 字符串长度是字符数不是字节数,使用不同的字符集,会使用不同的存储空间。
| | VARCHAR | CHAR |
| —- | —- | —- |
| 存储空间 |
1. 可能varchar更节省空间(也不一定:MYSQL使用ROW_FORMAT=FIXED时,VARCHAR也是定长);
1. VARCHAR需要额外的空间(1或2字节)来标识当前行有具体的长度(存储VARCHAR(10)需要11字节,VARCHAR(1000)需要1002字节),而CHAR不需要额外空间;
1. VARCHAR可能让页存不下数据,则需要发生页分裂;
| | | 数据格式化 | 不处理 |
1. 删除末尾的空格
1. 用空格在末尾填充剩余空间
1. 检索时去除末尾空格
| | Innodb | 过长的VARCHAR存储为BLOB | | | | | |
1.2.1 binary与varbinary类型
与char和varchar类似,区别在于:
BLOB和TEXT都为存储大数据而存在,分别采用二进制(没有排序规则和字符集)和字符方式存储。
- 当存储值太大时,Innodb会使用专门“外部”存储区域来存储,此时数据行行内需要1~4个字节存储外部指针。
- mysql对其进行排序:只对每个列最前max_sort_length字节做排序。可以配置max_sort_length,或使用 order by sustring(column, length)。
- 不能全部长度进行索引,也不能使用这些索引消除排序。
EXPLAIN的Extra列包含“Using temporary”,则说明这个查询使用了隐式临时表。
1.4 使用枚举(ENUM)代替字符串
- 枚举字段是按照内部存储的整数来存储的。
- 排序按照内部存储的整数来排序。
- 枚举添加或删除字符串必须使用ALTER TABLE。
最好就不使用枚举了,用tinyint替代。