MySQL 状态变量 Handler_read_rnd_next 增长很多

Pha*_*dra 12 mysql index-statistics

在 MYSQL 状态下,Handler_read_rnd_next 值非常高。

我知道,当执行没有正确索引的查询时,此值将增加。

但是,即使我们执行像“Handler_read_rnd_next”这样的显示状态,这个值也会增加 2。

基于这个状态标志,我们正在监控一些统计数据。

所以每一次,这个统计数据都显示出关键性。

我们能否从“Handler_read_rnd_next”计数中排除这些“显示”执行计数。

再举一个例子,

有一个 10 行的表,表在列 'data' 上建立索引,如果我们执行以下查询:

select data from test where data = 'vwx' -> returns one row
Run Code Online (Sandbox Code Playgroud)

如果我们检查 'Handler_read_rnd_next' 的值,它会增加 7。

以下是上述查询的解释命令的结果:

explain select data from test where data = 'vwx';

id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra

1, 'SIMPLE', 'test', 'ref', 'data', 'data', '35', 'const', 1, 'Using where; Using index'
Run Code Online (Sandbox Code Playgroud)

有没有办法限制这个值,或者我能知道为什么这个值增加得非常快。

Rol*_*DBA 5

首先我们来看Handler_read_rnd_next的定义。

根据Handler_read_rnd_next 上的MySQL 文档

读取数据文件中下一行的请求数。如果您进行大量表扫描,则此值很高。通常,这表明您的表没有正确索引,或者您的查询没有被写入以利用您拥有的索引。

现在,看看你的查询:

select data from test where data = 'vwx';
Run Code Online (Sandbox Code Playgroud)

你说这个表有 10 行。根据经验,如果需要检查的行数大于总行数的 5%,MySQL 查询优化器将不使用索引。

让我们来算一算。10 行的 5% 是 0.5 行。即使需要定位数据的行数为 1,也大于 0.5。基于较低的行数和我刚刚提到的索引规则,MySQL 查询优化器将始终执行表扫描。

由于列data本身是索引的,而不是表扫描,mysql 执行了索引扫描。

如果您确定测试表永远不会增长,您可以删除所有索引并让表扫描发生。处理程序状态变量应停止递增。