百木园-与人分享,
就是让自己快乐。

Handler_read_*的总结

在分析一个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
图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » Handler_read_*的总结

相关推荐

  • 暂无文章