我正在为自己开发的应用构建一些个人资料信息。我希望调试页面显示发送的查询以及检查了多少行而不假设slow_log已打开,更不用说解析它了。
早在2006年,我想要的是not possible。今天仍然如此吗?
我看到Peter Zaitsev有technique你在哪里:
FLUSH STATUS;
SHOW STATUS LIKE "Handler%";
然后在输出中:
Handler_read_next = 42250表示在此扫描期间分析了42250行
听起来好像MySQL只检查索引,它应该给你数字。但是有没有一组状态变量你可以轮询,加起来并找出检查了多少行?还有其他想法吗?
答案 0 :(得分:4)
它比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”。
答案 1 :(得分:2)
从5.6.3开始,MySQL performance_schema数据库还在诸如performance_schema.events_statements_current之类的表中公开语句统计信息。
语句收集的统计信息包括'ROWS_EXAMINED'列。
请参阅 http://dev.mysql.com/doc/refman/5.6/en/events-statements-current-table.html
从那里汇总统计数据以提供摘要。
请参阅 http://dev.mysql.com/doc/refman/5.6/en/statement-summary-tables.html
答案 2 :(得分:1)
Handler_read_rnd
基于固定位置读取行的请求数。如果您要执行大量需要对结果进行排序的查询,则此值很高。您可能有很多查询要求MySQL扫描整个表,或者您有不正确使用密钥的连接。
Handler_read_rnd_next
读取数据文件中下一行的请求数。如果您正在进行大量的表扫描,则此值很高。通常,这表明您的表没有正确编入索引,或者您的查询未编写以利用您拥有的索引。
read_rnd*
表示使用fullscan读取实际的表行。
请注意,如果索引扫描与行查找相结合,它将不会显示任何内容,它仍会被视为键读取。
对于这样的架构:
CREATE TABLE mytable (id INT NOT NULL PRIMARY KEY, data VARCHAR(50) NOT NULL)
INSERT
INTO mytable
VALUES …
SELECT id
FROM mytable
WHERE id BETWEEN 100 AND 200
SELECT *
FROM mytable
WHERE id BETWEEN 100 AND 200
,后两个查询将返回1
中的read_key
,101
中的read_next
以及0
和{{read_rnd
中的read_rnd_next
1}},尽管实际的行查找发生在第二个查询中。
答案 3 :(得分:0)
使用EXPLAIN预置查询。在MySQL中将显示查询的执行路径,检查哪些表以及为每个表检查的行数。