有趣的statement stack
创始人
2024-01-22 18:03:17
0

引子

在使用events_statements_current的过程中发现,同一线程在同一时刻,可能有多条记录,与直观感觉不太一样,于是跟踪了一下内部实现,有了本文。

STATEMENT STACK的定义

STATEMENT STACK 是events_statements_current表被后用于存储当前会话执行语句堆栈的数据结构。

在MySQL8中,相关定义如下:

/** Max size of the statements stack. */
uint statement_stack_max;/** nested statement lost */
uint nested_statement_lost;struct PFS_ALIGNED PFS_thread : PFS_connection_slice {
//...
/** Size of @c m_events_statements_stack. */uint m_events_statements_count;PFS_events_statements *m_statement_stack;
//...
}

其中:

  • m_statement_stack 语句堆栈
  • m_events_statements_count 语句堆栈栈顶指针
  • statement_stack_max 存储允许存储的最大语句数量
  • nested_statement_lost 存储丢失的语句数量

STATEMENT STACK相关小实验

1) 创建测试存储过程

存储过程的功能主要是:人为等待10秒左右

-- 保存为:stat_stack.sql
USE d1;
set sql_mode=oracle;set global log_bin_trust_function_creators = 1;DELIMITER $$
CREATE OR REPLACE PROCEDURE p1(a INT DEFAULT 1)
AS
BEGINSELECT a, SLEEP(a);
END$$CALL p1(10);

2) 启动终端1输入命令:

USE PERFORMANCE_SCHEMA;-- 确认采集打开
UPDATE setup_consumers SET ENABLED='YES' WHERE name = 'events_statements_current';-- Query OK, 0 rows affected (0.00 sec)
-- Rows matched: 1  Changed: 1  Warnings: 0-- 查询当前终端线程ID
SELECT thread_id FROM threads WHERE processlist_id=CONNECTION_ID() \G
-- thread_id: 58
-- 1 row in set (0.00 sec)-- 查询当前活跃语句,验证环境
SELECT sql_text FROM events_statements_current WHERE thread_id = 58 \G
-- sql_text: SELECT * FROM events_statements_current WHERE thread_id = 58
-- 1 row in set (0.00 sec)

3) 启动终端2输入命令:

USE PERFORMANCE_SCHEMA;-- 查询当前终端的thread_id
SELECT THREAD_ID FROM THREADS WHERE PROCESS_LIST_ID=CONNECTION_ID() \Gthread_id: 58
1 row in set (0.00 sec)source stmt_stack.sql
+------+----------+
| a    | SLEEP(a) |
+------+----------+
|    10|        0 |
+------+----------+
1 row in set (10.01 sec)Query OK, 0 rows affected (10.01 sec)

4) 切换终端1输入命令:

USE PERFORMANCE_SCHEMA;mysql> SELECT sql_text FROM events_statements_current WHERE thread_id = 58;
+--------------------+
| sql_text           |
+--------------------+
| CALL p1(10)        |
| SELECT a, SLEEP(a) |
+--------------------+
2 rows in set (0.01 sec)mysql> SELECT sql_text FROM events_statements_current WHERE thread_id = 58;
+-------------+
| sql_text    |
+-------------+
| CALL p1(10) |
+-------------+
1 row in set (0.00 sec)

注意:58是查到的内部线程号

结论:

可以看到:语句以及内嵌语句都被STATEMENT STACK捕获,同一时刻,同个会话,多条语句。

STATEMENT STACK如何更新

计数器增加

pfs_get_thread_statement_locker_v2

计数器减少

pfs_end_statement_v2

限制与扩展说明

  • 默认情况下: statement_stack_max = 10
  • 当语句嵌套层级大于: statement_stack_max 的时候,嵌套的语句就不会记录了,全局变量: nested_statement_lost会被更新
  • 通过语句'show global status like "%performance_schema_nested_statement_lost%";' 可以查询丢失语句的数量

Enjoy GreatSQL :)

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

捉虫活动详情:https://greatsql.cn/thread-97-1-1.html

社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

6440

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...