explain
我们可以通过explain关键字分析sql的执行计划,从而可以检查是否用到索引
当用的组合索引时,有可能只使用前半部分索引,此时key_len
的数值小于组合索引的大小
key_len的计算方式
- 如果这个字段允许为空,多占用1个字节的额外空间,所以索引字段最好不要为NULL,因为NULL让统计更加复杂,并且需要额外的存储空间。
- 不同编码,占用字节数不一样,例如utf8的varchar占用3个字节,utf8mb4的varchar占用4个字节
- 变长字段需要额外的2个字节(VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节),所以VARCAHR索引长度计算时候要加2)
- 例如 varchar(255)这个字段在utf8mb4编码下 占用字节数=255*4+1+2 ,其中的1是允许为null占用,2是变长字段记录长度的额外空间
- 固定长度字段(例如char(8))不需要额外的字节。这个字段在utf8mb4编码下 占用字节数=84如果允许为null,则 占用字节数=84+1)
- 对于
account_id varchar(20),region varchar(3),PurchaseDate varchar(30)
这样的组合索引 account_id, region, PurchaseDate,如果where条件跳过region,则只会使用到account_id索引,所以此时explain的结果中key_len的大小为20*4+2+1=83
各种类型占用字节数
测试环境:mysql8.0,字符集为utf8mb4
类型 | 字节数 | 编码 |
---|---|---|
int | 4 | utf8mb4 |
char | 4 | utf8mb4 |
varchar | 4 | utf8mb4 |
bigint | 8 | utf8mb4 |
datetime | 5 | utf8mb4 |
date | 4 | utf8mb4 |
time | 4 | utf8mb4 |
year | 2 | utf8mb4 |
timestamp | 5 | utf8mb4 |