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)
有没有办法限制这个值,或者我能知道为什么这个值增加得非常快。
首先我们来看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 执行了索引扫描。
如果您确定测试表永远不会增长,您可以删除所有索引并让表扫描发生。处理程序状态变量应停止递增。