接上一篇,我解释了为什么 EXPLAIN 估算 ROWS 不准确?并且解释了 ROWS 的计算原理。本文,我们在来说一下,ROWS 计算不准确,有没有替代方案?
替代方法肯定有,看标题,注意标题。接下来,我们说说 SHOW STATUS。
在 MySQL 性能调试中,EXPLAIN 能够解释 MySQL 执行计划,从而用来估算性能耗时。其中,rows 用来表示在 SQL 执行过程中会被扫描的行数,该值越大,意味着需要扫描的行数,相应的耗时更长。但是需要注意的是 EXPLAIN 中输出的 rows 只是一个估算值,不能完全对其百分之百相信,如 EXPLAIN 中对 LIMITS 的支持就比较有限。
使用 SHOW SESSION STATUS LIKE "Handler%" 正好可以解决这类问题。
具体用法如下:
SELECT * FROM XTTBLOG WHERE TYPE = 'JAVA' ORDER BY CREATED_TIME DESC LIMIT 10;
执行 SHOW SESSION STATUS LIKE "Handler%" 查看当前状态:
SHOW SESSION STATUS LIKE "Handler%"
返回的结果类似如下:
Variable_nameValue Handler_commit 1 Handler_delete 0 Handler_discover 0 Handler_external_lock 2 Handler_mrr_init 0 Handler_prepare 0 Handler_read_first 1 Handler_read_key 2 Handler_read_last 0 Handler_read_next 0 Handler_read_prev9 Handler_read_rnd 0 Handler_read_rnd_next 3 Handler_rollback 0 Handler_savepoint 0 Handler_savepoint_rollback 0 Handler_update 0 Handler_write 0
查看 Handler_read_prev 的值,发现是 9。可以看到还剩 9 条数据没有读,这才是实际准确的值。
show status 常用命令
-- 查询返回的行数 show status like '%innodb_rows_read%' -- 插入成功的行数 show status like '%innodb_rows_inserted%' -- 更新成功的行数 show status like '%innodb_rows_updated%' -- 删除成功的行数 show status like '%innodb_rows_deleted%' -- 查看锁 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; show status like '%innodb_status%' -- show status like '%Table%' -- 查看慢查询 show status like '%Slow%' -- 查看运行时间 show status like '%up%' -- 查看锁的时间分布 show status like'%innodb_row_lock%'; -- 执行select的计数 show status like '%Com_select%' -- 执行insert的计数,批量插入算一次 show status like '%Com_insert%' -- 执行更新操作的计数 show status like '%Com_update%' -- 执行删除操作的计数 show status like '%Com_delete%' -- 提交事务计数 show status like '%Com_commit%' -- 回滚事务计数 show status like '%Com_rollback%' -- 查看警告信息 show warnings
参考资料
- MySQL EXPLAIN limits and errors.
: » 使用 SHOW SESSION STATUS LIKE “Handler%” 替代 EXPLAIN ROWS 估算不准问题
原创文章,作者:6024010,如若转载,请注明出处:https://blog.ytso.com/252392.html