在分析一个SQL的性能好坏时,除了执行计划,另外一个常看的指标是\"Handler_read_*\"相关变量。
-
Handler_read_key
-
Handler_read_first
-
Handler_read_last
-
Handler_read_next
-
Handler_read_prev
-
Handler_read_rnd
-
Handler_read_rnd_next
这七个变量,官方文档也有讲解,但很多人看完后,还是一头雾水。
下面结合具体的示例,来看看这七个变量的具体含义和区别。
Handler
首先说说什么是handler。
handler是一个类,里面按不同的功能模块定义了若干接口(具体可参考sql/handler.h)。其中,
DML操作相关的接口有:
-
write_row()
-
update_row()
-
delete_row()
-
delete_all_rows()
-
start_bulk_insert()
-
end_bulk_insert()
索引扫描相关的接口有:
-
index_read_map()
-
index_init()
-
index_end()
-
index_read_idx_map()
-
index_next()
-
index_prev()
-
index_first()
-
index_last()
-
index_next_same()
-
index_read_last_map()
-
read_range_first()
-
read_range_next()
其它相关接口可参考sql/handler.h,sql/handler.cc文件。
如此设计,有两点显而易见的好处:
1. Server层与存储引擎层解耦。MySQL Server层在与存储引擎层交互时,无需关心存储引擎层的实现细节,直接调用handler对象的相关方法即可。
2. 降低了新引擎的引入门槛。如MyRocks。
测试数据
mysql> show create table t1\\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`k` int(10) unsigned NOT NULL DEFAULT \'0\',
`c` varchar(20) NOT NULL DEFAULT \'\',
`pad` varchar(20) NOT NULL DEFAULT \'\',
PRIMARY KEY (`id`),
KEY `k` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 100 |
+----------+
1 row in set (0.00 sec)
mysql> select * from t1 limit 6;
+----+---+--------+----------+
| id | k | c | pad |
+----+---+--------+----------+
| 1 | 1 | test_c | test_pad |
| 2 | 1 | test_c | test_pad |
| 3 | 1 | test_c | test_pad |
| 4 | 4 | test_c | test_pad |
| 5 | 5 | test_c | test_pad |
| 6 | 6 | test_c | test_pad |
+----+---+--------+----------+
6 rows in set (0.00 sec)
来源:https://www.cnblogs.com/ivictor/p/14877885.html
图文来源于网络,如有侵权请联系删除。