概述
MySQL有一个神秘的HANDLER
命令,此命令非SQL标准语法,可以降低优化器对于SQL语句的解析与优化开销,从而提升查询性能。
步骤
# 1. 更新会话
FLUSH STATUS;
# 2. 执行一段SQL语句
SELECT * FROM CAR WHERE CAR_BRANK LIKE "别克%" ORDER BY ID DESC LIMIT 10;
# 3.1 查看当前会话
SHOW SESSION STATUS LIKE "handler_read%";
# 3.2 查看全局会话
SHOW GLOBAL STATUS LIKE "HANDLER%"
# 4. 解释SQL语句
EXPLAIN SELECT * FROM CAR WHERE CAR_BRANK LIKE "别克%" ORDER BY ID DESC LIMIT 10;
Handler参数
参数 | 解释 | 范围 |
---|---|---|
Handler_commit | 内部提交语句数 | GLOBAL |
Handler_delete | 删除行的次数 | GLOBAL |
Handler_discover | MySQL服务器可以询问NDB CLUSTER 存储引擎是否知道某一名字的表。这被称作发现。Headler_discover 说明通过该方法发现的次数。 | GLOBAL |
Handler_external_lock | 此变量与锁操作数量有关,主要是在表访问的开始和结束起作用。 | GLOBAL |
Handler_mrr_init | 服务器使用存储引擎自己实现的多范围读取的次数。 | GLOBAL |
Handler_prepare | 用于两阶段提交操作的准备阶段计数器。 | GLOBAL |
Handler_read_first | 索引中第一条被读取的次数 | SESSION |
Handler_read_key | 根据键读取一行的请求数。此选项数值如果很高,那么恭喜你,你的系统高效的使用了索引,一切运转良好。 | SESSION |
Handler_read_last | 根据键读取最后一行的请求数。 | SESSION |
Handler_read_next | 根据键读下一行的请求数。如果查询语句中使用范围约束或索引扫描来查询索引列,该值增加。 | SESSION |
Handler_read_prev | 根据键顺序读前一行的请求数。该读取方式主要用于优化ORDER BY ... DESC 。 | SESSION |
Handler_read_rnd | 根据固定位置读一行的请求数。如果你正执行大量查询并需要对结果进行排序该值较高,那么你可能使用了大量全表扫的的查询或你的连接没有正确使用索引。 | SESSION |
Handler_read_rnd_next | 在数据文件中读下一行的请求数。如果你正在进行大量的表扫描,该值较高。通常说明你的表索引不正确或写的语句没有利用到索引。 | SESSION |
Handler_rollback | ROLLBACK语句的数量 | GLBOAL |
Handler_savepoint | 在一个存储引擎放置一个保存点的请求数量。 | GLOBAL |
Handler_savepoint_rollback | 在一个存储引擎的要求回滚到一个保存点的请求数量。 | GLOBAL |
Handler_update | 更新表中一行数据的次数。 | GLOBAL |
Handler_write | 插入一行数据的次数。 | GLOBAL |
Handler_read_first
The number of times the first entry was read from an index. If this value is high, it suggests that the server is doing a lot of full index scans; for example, SELECT col1 FROM foo, assuming that col1 is indexed.
此选项表明SQL是在做一个全索引扫描,注意是全部,而不是部分,所以说如果存在WHERE语句,这个选项是不会变的。如果这个选项的数值很大,既是好事 也是坏事。说它好是因为毕竟查询是在索引里完成的,而不是数据文件里,说它坏是因为大数据量时,简便是索引文件,做一次完整的扫描也是很费时的。
最后
不同平台,不同版本的MySQL,在运行上面例子的时候,Handler_read_*的数值可能会有所不同,这并不要紧,关键是你要意识到 Handler_read_*可以协助你理解MySQL处理查询的过程,很多时候,为了完成一个查询任务,我们往往可以写出几种查询语句,这时,你不妨挨 个按照上面的方式执行,根据结果中的Handler_read_*数值,你就能相对容易的判断各种查询方式的优劣。
相关内容
MySQL优化:https://blog.csdn.net/weixin_43932609/article/details/106156679
MySQL优化工具之Show profiles详解:
https://blog.csdn.net/weixin_43932609/article/details/108170328
=========================================================
人生得意须尽欢,莫使金樽空对月!
__一个热爱说唱的程序员。
=========================================================