网易首页 > 网易号 > 正文 申请入驻

新特性解读 | MySQL 8.0 语句摘要功能介绍

0
分享至

作者:杨涛涛
资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、MySQL 相关课程培训等工作。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

一、背景介绍

在介绍 MySQL 8.0 的语句摘要函数之前,先来看看经典的慢日志过滤结果:

# mysqldumpslow -s c -t 10 -g 'order by' debian-ytt1-slow.log
Reading mysql slow query log from debian-ytt1-slow.logCount: 8 Time=10.41s (83s) Lock=0.00s (0s) Rows=2.0 (16), root[root]@localhost select * from p1 where id > N order by rand() limit N
Count: 2 Time=15.06s (30s) Lock=0.00s (0s) Rows=2.0 (4), root[root]@localhost select * from p1 where N order by rand() limit N
Count: 1 Time=6.35s (6s) Lock=0.00s (0s) Rows=2.0 (2), root[root]@localhost select * from p1 where id >N-N order by rand() limit N

对慢日志进行过滤分析,按照执行次数排序,拿出前 10 条语句,比如第 1 条语句:

select * from p1 where id > N order by rand() limit N;

这里的 N 代表数字,也就是说无论数字多少,都可以用这条语句来代替。举个例子,下面 3 条 SQL 都可以用上面的 SQL 来代替。

select * from p1 where id > 1000 order by rand() limit 2;
select * from p1 where id > 1000 order by rand() limit 10;
select * from p1 where id > 20000 order by rand() limit 100;

用来代替这几条 SQL 的语句文本叫做摘要文本

摘要文本提供了比较 SQL 语句不同分类的便利性。比如对于慢日志来说,用 mysqldumpslow 来分类查看慢语句结果就比直接看慢日志来的简单。

更进一步,如果语句很长,摘要文本也会很长,为了更加方便比较,MySQL 对摘要文本用哈希函数 SHA2 做了一个哈希,完了用此哈希值进行比较。这两个功能就是 MySQL 8.0 新增加的两个函数,statement_digest 和 statement_digest_text。

  • statement_digest():计算 SQL 语句的摘要哈希值。

  • statement_digest_text():返回 SQL 语句对应的摘要文本。

现在来用以上两个函数来计算下上面这 3 条 SQL 的摘要。结果和慢日志过滤分析的一样,不过数字 N 变为“?”,这 3 条语句为一个类型,摘要文本一样。

mysql> select statement_digest_text('select * from p1 where id > 1000 order by rand() limit 2') digest_text;+---------------------------------------------------------------+| digest_text |+---------------------------------------------------------------+| SELECT * FROM `p1` WHERE `id` > ? ORDER BY `rand` ( ) LIMIT ? |+---------------------------------------------------------------+1 row in set (0.00 sec)
mysql> select statement_digest_text('select * from p1 where id > 1000 order by rand() limit 10') digest_text;+---------------------------------------------------------------+| digest_text |+---------------------------------------------------------------+| SELECT * FROM `p1` WHERE `id` > ? ORDER BY `rand` ( ) LIMIT ? |+---------------------------------------------------------------+1 row in set (0.00 sec)
mysql> select statement_digest_text('select * from p1 where id > 20000 order by rand() limit 100') digest_text;+---------------------------------------------------------------+| digest_text |+---------------------------------------------------------------+| SELECT * FROM `p1` WHERE `id` > ? ORDER BY `rand` ( ) LIMIT ? |+---------------------------------------------------------------+1 row in set (0.00 sec)

对应的摘要哈希值:可以看到 3 条语句对应的摘要相同。所以在比较 3 条语句的执行次数,执行时间等指标时,可以用一个哈希值来比较。

mysql> select statement_digest('select * from p1 where id > 1000 order by rand() limit 2') digest_has;+------------------------------------------------------------------+| digest_has |+------------------------------------------------------------------+| 32744c535a56acf37beb1702573cab41eff5f14953c9b1c2b73c7f1583e3eaf0 |+------------------------------------------------------------------+1 row in set (0.00 sec)
mysql> select statement_digest('select * from p1 where id > 1000 order by rand() limit 10') digest_hash;+------------------------------------------------------------------+| digest_hash |+------------------------------------------------------------------+| 32744c535a56acf37beb1702573cab41eff5f14953c9b1c2b73c7f1583e3eaf0 |+------------------------------------------------------------------+1 row in set (0.00 sec)
mysql> select statement_digest('select * from p1 where id > 20000 order by rand() limit 100') digest_hash;+------------------------------------------------------------------+| digest_hash |+------------------------------------------------------------------+| 32744c535a56acf37beb1702573cab41eff5f14953c9b1c2b73c7f1583e3eaf0 |+------------------------------------------------------------------+1 row in set (0.00 sec)

摘要文本以及摘要哈希值的一致性来自于表或者过滤字段的不变性,如果表名或者过滤字段有变化,MySQL 将会归类这些查询语句为不同的摘要。

二、 使用场景

SQL 语句摘要可以用在MySQL的各个方面,比如 性能字典里对语句的分析,查询重写插件规则改写等等。

接下来依次看下语句摘要在这两方面的使用。

1. 性能字典

mysql> call sys.ps_setup_enable_consumer('statements');+---------------------+| summary |+---------------------+| Enabled 4 consumers |+---------------------+1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

开启后,执行几次之前的几条 SQL。

完后可以很方便的从 sys 库里分析这类语句的执行情况,包括执行次数,执行时间,扫描的记录数,锁定的时间,是否用到排序等等。

mysql> SELECT * FROM sys.`statement_analysis` > WHERE digest = statement_digest('select * from p1 where > id > 1000 order by rand() limit 2')\G*************************** 1. row *************************** query: SELECT * FROM `p1` WHERE `id` > ? ORDER BY `rand` ( ) LIMIT ? db: ytt full_scan: exec_count: 4 err_count: 0 warn_count: 0 total_latency: 46.08 s max_latency: 16.26 s avg_latency: 11.52 s lock_latency: 595.00 us rows_sent: 122 rows_sent_avg: 31 rows_examined: 36000126rows_examined_avg: 9000032 rows_affected: 0rows_affected_avg: 0 tmp_tables: 0 tmp_disk_tables: 0 rows_sorted: 122sort_merge_passes: 0 digest: 32744c535a56acf37beb1702573cab41eff5f14953c9b1c2b73c7f1583e3eaf0 first_seen: 2020-08-17 13:34:58.676034 last_seen: 2020-08-17 13:40:02.0820391 row in set (0.00 sec)

2. 查询重写插件

比如要阻止对表 p1 通过字段 r1 的删除动作,可以用查询重写插件在 MySQL 语句分析层直接转换,这时候就得用到摘要函数 statement_digest_text。

假设:表 p1 字段 id 值全部为正。

delete from p1 where id = 1000;

要改写为,

delete from p1 where id = -1;

利用函数 statement_digest_text 来定制这条 SQL 的重写规则。

mysql> INSERT INTO query_rewrite.rewrite_rules (pattern, replacement,pattern_database) -> VALUES( -> statement_digest_text('delete from p1 where id = 1000') , -> statement_digest_text('delete from p1 where id = -1'), -> 'ytt' -> );Query OK, 1 row affected (0.01 sec)
mysql> CALL query_rewrite.flush_rewrite_rules();Query OK, 1 row affected (0.02 sec)
mysql> select * from query_rewrite.rewrite_rules\G*************************** 1. row *************************** id: 1 pattern: DELETE FROM `p1` WHERE `id` = ? pattern_database: ytt replacement: DELETE FROM `p1` WHERE `id` = - ? enabled: YES message: NULL pattern_digest: a09b20197de495d603324d6ed617cb5d05fa0e3011bea8e9db7d2939df22940anormalized_pattern: delete from `ytt`.`p1` where (`id` = ?)1 row in set (0.00 sec)

语句被查询重写后的效果:

mysql> delete from p1 where id = 20000;Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show warnings\G*************************** 1. row *************************** Level: Note Code: 1105Message: Query 'delete from p1 where id = 20000' rewritten to 'DELETE FROM `p1` WHERE `id` = - 20000' by a query rewrite plugin1 row in set (0.00 sec)
mysql> select count(*) from p1;+----------+| count(*) |+----------+| 9000001 |+----------+1 row in set (1.59 sec)

总结

MySQL 8.0 新增的语句摘要函数可以很方便的分析 SQL 语句执行的各个方面,比以前分析类似的场景要简单的多。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
破案了!路边18元一只的烤鸭,用的根本不是你以为的那种鸭子!

破案了!路边18元一只的烤鸭,用的根本不是你以为的那种鸭子!

大眼妹妹
2026-06-30 21:56:03
李玟离世满3年!主诊医生、救护员被正式起诉,致命真相被揭开

李玟离世满3年!主诊医生、救护员被正式起诉,致命真相被揭开

一盅情怀
2026-06-30 08:10:15
papi酱首谈原生家庭:父亲生性风流,其再婚妻子仅比我大几岁,20岁前对回家既期待又害怕

papi酱首谈原生家庭:父亲生性风流,其再婚妻子仅比我大几岁,20岁前对回家既期待又害怕

都市快报橙柿互动
2026-06-28 08:38:53
重磅转折!2大豪门退出争抢,曼联绝境逆袭锁定中场补强良机?

重磅转折!2大豪门退出争抢,曼联绝境逆袭锁定中场补强良机?

姜来不加盐
2026-06-30 11:04:37
突发!湖人将在明天与杜伦会面,但签了他就留不住詹姆斯

突发!湖人将在明天与杜伦会面,但签了他就留不住詹姆斯

奕辰说球
2026-06-30 16:22:02
中国正式进入“超级内卷”时代!只有一种人能赚钱(深度)

中国正式进入“超级内卷”时代!只有一种人能赚钱(深度)

新浪财经
2026-06-23 08:51:12
快讯!日本声称无法接受中国第二轮出口管控!

快讯!日本声称无法接受中国第二轮出口管控!

故事终将光明磊落
2026-06-30 11:48:39
“她就是个累赘”,怀胎十月约见网友,用力过猛临盆扼杀新生女儿

“她就是个累赘”,怀胎十月约见网友,用力过猛临盆扼杀新生女儿

易玄
2026-06-26 11:13:44
医生买俩烧饼充饥被举报走人,一月后举报人跪求救命,他傻眼了

医生买俩烧饼充饥被举报走人,一月后举报人跪求救命,他傻眼了

晓艾故事汇
2026-06-27 15:44:01
吴月娘:我这浪肉,被男人摸一下真好

吴月娘:我这浪肉,被男人摸一下真好

老达子
2026-06-26 06:50:03
宝马新X5预告片揭示X形车灯设计,6月30日全球首发

宝马新X5预告片揭示X形车灯设计,6月30日全球首发

体育硬核说
2026-06-30 00:46:29
沈梦辰成功追星张凌赫,杜海涛吃醋自称杜顶赫,沈梦辰紧急安抚

沈梦辰成功追星张凌赫,杜海涛吃醋自称杜顶赫,沈梦辰紧急安抚

娱乐寡姐
2026-06-30 23:33:27
离谱!伦敦车主若停车使用汽车空调来降温 最高可被罚款110英镑

离谱!伦敦车主若停车使用汽车空调来降温 最高可被罚款110英镑

快科技
2026-06-28 14:12:11
迎来第一波“失业潮”的不是教师,不是医生,而是这四个行业!

迎来第一波“失业潮”的不是教师,不是医生,而是这四个行业!

职场资深秘书
2026-06-28 14:27:05
张召忠警告:2100枚核弹24小时待命,开战无处可逃

张召忠警告:2100枚核弹24小时待命,开战无处可逃

七堇年a
2026-06-29 19:26:01
台湾退役中将:张学良被软禁一点不冤,西安近乎打光蒋奉化御林军

台湾退役中将:张学良被软禁一点不冤,西安近乎打光蒋奉化御林军

磊子讲史
2026-06-29 15:34:11
英伟达在华启动机器人人才招聘,聚焦具身智能等四大方向

英伟达在华启动机器人人才招聘,聚焦具身智能等四大方向

IT之家
2026-06-30 20:04:11
央八首播!34集谍战巨制来袭,仅播出一天,收视率直接登顶

央八首播!34集谍战巨制来袭,仅播出一天,收视率直接登顶

乐枫电影
2026-06-30 18:00:47
替董事长坐12年牢,出来后他转我600万,他女儿:我爸要我嫁给你

替董事长坐12年牢,出来后他转我600万,他女儿:我爸要我嫁给你

千秋文化
2026-06-27 19:44:16
安切洛蒂:我们从来没有想过不能扳平;日本队非常值得尊重

安切洛蒂:我们从来没有想过不能扳平;日本队非常值得尊重

懂球帝
2026-06-30 06:04:01
2026-07-01 00:08:49
爱可生云数据库
爱可生云数据库
企业数据处理技术整体解决方案
411文章数 20关注度
往期回顾 全部

科技要闻

iPhone18 Pro遭泄密!印度代工商惹祸

头条要闻

坎贝尔承认:中国是最成功渡过难关的国家

头条要闻

坎贝尔承认:中国是最成功渡过难关的国家

体育要闻

大热倒灶压力给到法国 王楚揭法国队隐患

娱乐要闻

广电总局发布2026年“微短剧+”行动计划推荐剧目

财经要闻

万亿“寒王”,历史时刻

汽车要闻

奇瑞风云A9探店 五个理由一定来看看

态度原创

本地
游戏
旅游
家居
亲子

本地新闻

贵州小城的新目标:举办“村超”世界杯!

MSI入围赛遭诟病,开赛5场全部三比零,网友吐槽拳头提出1个建议

旅游要闻

不用走远,云贵分界的这座小城,藏着云南最厚重的交通历史!

家居要闻

传奇筑 日常诗

亲子要闻

✨闪闪小葵花 成长正当时✨ 「寻找闪亮小主角」才艺展示活动 表演现场高光集锦,见证萌娃的舞台魅力~

无障碍浏览 进入关怀版