SQL DIGEST是什么
DIGEST TEXT
DIGEST TEXT本质是一种SQL语句规范化后将常量替换成’?'的运算结果,STATEMENT_DIGEST_TEXT函数用于计算语句的DIGEST TEXT(摘要文本)
mysql> SELECT STATEMENT_DIGEST_TEXT('SELECT * FroM T1 WHERE c1 > 10 and c2="abc" AND 1+SIN(3) > 0;') AS label;
+------------------------------------------------------------------------+
| label |
+------------------------------------------------------------------------+
| SELECT * FROM `T1` WHERE `c1` > ? AND `c2` = ? AND ? + `SIN` (?) > ? ; |
+------------------------------------------------------------------------+
1 row in set (0.00 sec)
复制
注意:
关键字都被大写
标识符都被加反引号
常量包括数值常量和字符串常量都被替换成’?’
SQL DIGEST
SQL DIGEST本质是将SQL语句规范化后将常量替换成’?'的字符串进行哈希运算得到的结果,STATEMENT_DIGEST函数用于计算语句的SQL DIGEST(SQL摘要)
mysql> SELECT STATEMENT_DIGEST('SELECT * FROM T1 WHERE c1 > 2;') AS label;
+------------------------------------------------------------------+
| label |
+------------------------------------------------------------------+
| 3e2db85c14a4bc5662e406bedb24bc3b47bc98ee99f28bba846e32980a09448d |
+------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT STATEMENT_DIGEST('SelecT * FROM T1 WHERE c1 > 2;') AS label;
+------------------------------------------------------------------+
| label |
+------------------------------------------------------------------+
| 3e2db85c14a4bc5662e406bedb24bc3b47bc98ee99f28bba846e32980a09448d |
+------------------------------------------------------------------+
1 row in set (0.00 sec)
复制
注意:
关键字的大小写和空格不影响摘要值的计算
常量值的变化不影响摘要值的计算
SQL DIGEST有什么作用
在性能或工作负载分析中,需要对当前或区间运行语句进行统计分析,如果直接使用SQL会导致分析失焦,如果使用SQL DIGEST进行分析,通常分析目标会下降2-3个数量级,运行最复杂的生产系统,一般就是在万这个级别,通常在几千到几万。使用SQL DIGEST分析的好处包括:
作为SQL语句的指纹基本携带了SQL语句中相对重要的信息
分析目标显著减少
SQL DIGEST值相对稳定,可以在关联分析时,用做JOIN的条件
代码中与SQL DIGEST相关的处理函数
计算STATEMENT_DIGEST_TEXT的函数:
/*
参考: sql_digest.cc
Iterate token array and updates digest_text.
*/
void compute_digest_text(const sql_digest_storage *digest_storage, String *digest_text)
计算STATEMENT_DIGEST的函数:
/*参考: sql_digest.cc*/
void compute_digest_hash(const sql_digest_storage *digest_storage, unsigned char *hash)
复制
FAQ
问题 | 答案 |
---|---|
语句末尾的’;'是否影响语句DIGEST的计算? | YES |
不同数据库的相同SQL的SQL DIGEST是否相同? | NO |
SQL DIGEST是否基于DIGEST TEXT计算? | NO SQL DIGEST基于解析树生成的特殊表示计算,包括:将TOKEN替换成数值,将标识符替换成长度和字符串等。 |
对表或表的视图进行查询是否生成不一样的SQL DIGEST? | YES |
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1392次阅读
2025-03-13 11:40:53
MySQL8.0统计信息总结
闫建(Rock Yan)
527次阅读
2025-03-17 16:04:03
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
486次阅读
2025-03-13 14:38:19
SQL优化 - explain查看SQL执行计划(一)
金同学
416次阅读
2025-03-13 16:04:22
MySQL突然崩溃?教你用gdb解剖core文件,快速锁定“元凶”!
szrsu
392次阅读
2025-03-13 00:29:43
MySQL生产实战优化(利用Index skip scan优化性能提升257倍)
chengang
347次阅读
2025-03-17 10:36:40
MySQL数据库当前和历史事务分析
听见风的声音
333次阅读
2025-04-01 08:47:17
MySQL 生产实践-Update 二级索引导致的性能问题排查
chengang
297次阅读
2025-03-28 16:28:31
墨天轮个人数说知识点合集
JiekeXu
282次阅读
2025-04-01 15:56:03
一键装库脚本3分钟极速部署,传统耗时砍掉95%!
IT邦德
276次阅读
2025-03-10 07:58:44