数据表每个字段所占空间,需要计算出来.在设计表尽量少占用空间,这样在批量插入时单次插入的条数会增加.从而提高效率
数字类型
类型 | 占用字节 |
---|---|
tinyint | 1个字节 |
smallint | 2个字节 |
mediumint | 3个字节 |
int | 4个字节 |
bigint | 8个字节 |
float | 4个字节 |
double | 8个字节 |
DECIMAL | 定义为DECIMAL(M,D) 则占用 M 个字节 |
时间类型
数据类型 | MySQL 5.6.4 之前所需的存储 | 从 MySQL 5.6.4 开始所需的存储 |
---|---|---|
YEAR | 1 字节 | 1 字节 |
DATE | 3 字节 | 3 字节 |
TIME | 3 字节 | 3 字节 + 秒小数部分存储 |
DATETIME | 8 字节 | 5 字节 + 秒小数部分存储 |
TIMESTAMP | 4 字节 | 4 字节 + 秒小数部分存储 |
从MySQL 5.6.4开始,YEAR和DATE的存储保持不变。但是,表示时间、日期时间和时间戳 不同。需要 5 个字节而不是 8 个字节 非分数部分,所有三个部分都有一个分数部分 这需要 0 到 3 个字节,具体取决于小数存储值的秒精度。
秒小数部分精度 | 所需存储 |
---|---|
0 | 0 字节 |
1, 2 | 1 字节 |
3, 4 | 2 字节 |
5, 6 | 3 字节 |
例如,TIME(0)、TIME(2)、TIME(4) 和 TIME(6) 使用 0、1、3、5 个字节, TIME 和 TIME(0) 是等价的,需要相同的存储。
字符类型
- char和varchar,text根据存储的是汉字还是字母和数字占用的字节不同
- char是固定长度,varchar是可变长度.字节根据存储数据变化
- 不同的编码格式下所占字节也不同, 一个字符最多占用4个字节
那批量插入时一次多少条效率最高呢?
- 需要根据数据表字段所占用的字节 * 批量插入的条数(不能超过max_allowed_packet设置的大小)进行测试, 不一定到达max_all_packet最好.
- 也和缓冲区innodb_buffer_pool_size参数有关, 缓冲区设置大了, 磁盘IO的次数可能会少一些
- max_allowed_packet和innodb_buffer_pool_size说明