检查预处理语句

prepared_statements_instances 表包含服务器中存在的所有预处理语句。

  • 它和events_statements_[current|history|history_long] 表有相同的统计数据,此外还有关于预处理语句所属的线程以及该语句被执行了多少次的信息。

  • 和 events_statements_[current|history|history_long] 表不同的是,统计数据是累加的,这个表包含所有语句执行的总量。

要启用预处理语句检测,需要启用下表所示的插桩:

statement/sql/prepare_sql

文本协议中的 PREPARE 语句(通过 MySQL CLI 运行)

statement/sql/execute_sql

文本协议中的 EXECUTE 语句(通过 MySQL CLI 运行)

statement/com/Prepare

二进制协议中的 PREPARE 语句(通过 MySQL C API 访问)

statement/com/Execute

二进制协议中的 EXECUTE 语句(通过 MySQL C API 访问)

一旦启用预处理语句功能,一个预处理好的语句就可以多次执行:

PREPARE stmt FROM 'SELECT * FROM sakila.rental WHERE rental_id = ?';
SET @rental_id = 1;
EXECUTE stmt USING @rental_id;

然后查看诊断结果:

SELECT
    statement_name,
    sql_text,
    owner_thread_id,
    count_reprepare,
    count_execute,
    sum_timer_execute
FROM prepared_statements_instances;

注意

只有在服务器中存在的预处理语句才能在 prepared_statements_instances 表中查到统计信息。一旦预处理语句被删除,就不能再访问这些统计信息了:

DROP PREPARE stmt;
SELECT * FROM prepared_statements_instances;
Empty set (0.00 sec)

最后更新于