我正在为本土应用程序构建一些配置文件信息.我希望调试页面显示发送的查询以及检查了多少行而不假设slow_log已打开,更不用说解析它了.
早在2006年,我想要的就是不可能.今天仍然如此吗?
我看到Peter Zaitsev有一种技巧,你可以:
FLUSH STATUS;SHOW STATUS LIKE "Handler%";然后在输出中:
Handler_read_next = 42250表示在此扫描期间分析了42250行
听起来好像MySQL只检查索引,它应该给你数字.但是有没有一组状态变量你可以轮询,加起来并找出检查了多少行?还有其他想法吗?
它比 2006 年略好。您可以在前后发出 SHOW SESSION STATUS,然后查看每个 Handler_read_* 计数,以便能够判断检查的行数。
真的没有别的办法了。虽然服务器协议有一个标志来说明是否发生了表扫描,但它不会公开rows_examined。即使像 MySQL 的查询分析器这样的工具也必须通过在之前/之后运行 SHOW SESSION STATUS 来工作(尽管我认为它只在 之后运行 SHOW SESSION STATUS ,因为它会记住以前的值)。
我知道这与您的原始问题无关,但是除了rows_examined 之外,还有其他昂贵的查询组件。如果您选择通过慢速日志执行此操作,则应查看此补丁:
http://www.percona.com/docs/wiki/patches:microslow_innodb#changes_to_the_log_format
我可以推荐寻找“Disk_tmp_table: Yes”和“Disk_filesort: Yes”。
来自文档:
\n\n\n\n
Handler_read_rnd基于固定位置读取一行的请求数。如果您正在进行大量需要对结果进行排序的查询,则该值会很高。您可能有很多查询需要 MySQL 扫描整个表,或者您有未正确使用键的联接。
\n\n
Handler_read_rnd_next读取数据文件中下一行的请求数。如果您进行大量表扫描,则该值会很高。一般来说,这表明您的表没有正确索引,或者您的查询没有编写来利用您拥有的索引。
\n
read_rnd*意味着通过全扫描读取实际的表行。
请注意,如果有索引扫描与行查找相结合,它不会显示任何内容,它仍然算作键读取。
\n对于这样的模式:
\nCREATE TABLE mytable (id INT NOT NULL PRIMARY KEY, data VARCHAR(50) NOT NULL)\n\nINSERT\nINTO mytable\nVALUES \xe2\x80\xa6\n\nSELECT id\nFROM mytable\nWHERE id BETWEEN 100 AND 200\n\nSELECT *\nFROM mytable\nWHERE id BETWEEN 100 AND 200\nRun Code Online (Sandbox Code Playgroud)\n,后两个查询都将返回1in read_key、101inread_next以及0inread_rnd和read_rnd_next,尽管实际的行查找发生在第二个查询中。