数据表每个字段所占空间,需要计算出来.在设计表尽量少占用空间,这样在批量插入时单次插入的条数会增加.从而提高效率
数字类型
| 类型 | 占用字节 | 
|---|---|
| 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说明
官网链接