key_len的计算方式

explain

我们可以通过explain关键字分析sql的执行计划,从而可以检查是否用到索引
当用的组合索引时,有可能只使用前半部分索引,此时key_len的数值小于组合索引的大小

key_len的计算方式

  • 如果这个字段允许为空,多占用1个字节的额外空间,所以索引字段最好不要为NULL,因为NULL让统计更加复杂,并且需要额外的存储空间。
  • 不同编码,占用字节数不一样,例如utf8varchar占用3个字节,utf8mb4的varchar占用4个字节
  • 变长字段需要额外的2个字节(VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节),所以VARCAHR索引长度计算时候要加2)
    • 例如 varchar(255)这个字段在utf8mb4编码下 占用字节数=255 * 4+1+2 ,其中的1是允许为null占用,2是变长字段记录长度的额外空间
  • 固定长度字段(例如char(8))不需要额外的字节。这个字段在utf8mb4编码下 占用字节数=8 * 4如果允许为null,则 占用字节数=8 * 4+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
posted @ 2021-06-21 09:24  rm-rf*  阅读(151)  评论(0编辑  收藏  举报