MySQL有很多状态变量,每个状态变量都有其背后所代表的意义,本文介绍状态变量Handler_read_next及在哪些场景中,这个状态变量的值会显著增长。
一、Handler_read_next官方文档描述:
Handler_read_next
The number of requests to read the next row in key order. This value is incremented if you are querying an index column with a range constraint or if you are doing an index scan.
翻译成中文,大概意思是按照索引顺序读取行记录的数量,这是一个累计值,如果按范围查询一个索引或者做一个索引扫描,就会导致这个值增长。
二、Handler_read_next场景测试:
下面做几个实验,观察一下Handler_read_next值的增长情况。
MySQL版本:5.7.19
表t1,3个字段分别为id,name,age,其中id为自增主键,表中一共有记录12289。
全表扫描:
flush status; 重置所有状态变量为0。
执行 select count(*) from t1 where age = 21;
age列没有索引,SQL走全表扫描,等值查询,Handler_read_next 为0。
全表扫描,范围查询:
select count(*) from t1 where age >5 and age < 20;
Handler_read_next 为0。
主键索引或者唯一索引:
flush status; 重置所有状态变量为0。
执行 select count(*) from t1 where id = 21;
走主键索引或者唯一索引,Handler_read_next 为0。
范围查询:
select count(*) from t1 where id >5 and id < 20;
Handler_read_next 为 13,与满足条件的记录数一致。
非唯一索引:
在age字段上添加非唯一索引。
flush status; 重置所有状态变量为0。
select count(*) from t1 where age =12;
Handler_read_next 为 2049,与满足条件的记录数一致。
范围查询:
select count(*) from t1 where age >5 and age < 20;
Handler_read_next 为 12289,与满足条件的记录数一致。
三、总结:
MySQL 的 Handler_read_next 状态变量记录下列场景下的索引扫描记录数。
- 主键索引的范围查询。
- 唯一索引的范围查询
- 非唯一索引的等值查询
- 非唯一索引的范围查询