马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
引言
在 MySQL 大版本升级(比方 5.7 → 8.0、8.0 → 8.4)过程中,最大的风险往往不是安装部署,而是优化器行为改变、执行计划变化导致的 SQL 性能回退。一个原来走索引的查询,升级后可能变玉成表扫描;一个原来毫秒级返回的查询,升级后可能突然拖垮整库。因此,在正式升级前,我们需要用线上真实 SQL 在新旧两个版本上做一次系统性的性能比对。
大致思路
- 准备三节点mysql集群,主库低版本,从库低版本,从库高版本
- 主库设置慢查询时间为0s,用于收集所有sql,注意要磁盘空间大点。
- 使用pt-query-digest分析出所有select语句保存到文件,对文件做一些处理,加上explain保存到另一份文件。
- 使用pt-upgrade以及上面天生的select语句文件再高版本和低版本比对执行计划。
- 再高低版本执行explain文件,使用AI分析执行计划
结果
使用AI分析的执行计划
指标数量完全一致的计划10242存在差别的计划1342其中:结构差别(type/key/possible_keys/key_len/ref/Extra)37其中:仅 rows 估算差别1305差别严重程度字段级差别数 高(索引/访问类型/排序行为变化)103 中(候选索引/引用列/行数剧变)71 低(Extra 附加信息 / rows 波动)1347重点关注差别严重高的pt-upgrade高低版本的跑分
pt-upgrade可以分析以及输出差别报告,比方:
Reporting class because there are 3 query diffs.
Total queries 3
Unique queries 3
Discarded queries 0
select f? from mcsd? where f? = ?
-- 1.
0.000030 vs. 0.000381 seconds (12.7x increase)
SELECT F002 FROM mcsd012 WHERE F001 = '000731.SZ' /TracdId:SHELL_1b32744801983d58179ba98ca9ae35998c231dfe/
-- 2.
0.000029 vs. 0.001352 seconds (46.6x increase)
SELECT F002 FROM mcsd028 WHERE F001 = '000753.SZ' /TracdId:SHELL_1b32744801983d58179ba98ca9ae35998c231dfe/
-- 3.
0.000028 vs. 0.000865 seconds (30.9x increase)
SELECT F002 FROM mcsd022 WHERE F001 = '000755.SZ' /TracdId:SHELL_1b32744801983d58179ba98ca9ae35998c231dfe/
同样使用AI分析一下pt-upgrade的报告,如下:
性能差别明显的 SQL 清单(按 5.7 最慢耗时降序)
[table][tr]#class_id5.6(s)5.7(s)倍数表/模板[/tr][tr][td]1[/td][td]DE3D96295BAE12E3[/td][td]0.131869[/td][td]7.456917[/td][td]56.5x[/td][td]select node.id as nodeid, graph_id as graphid, node_name as nodename, chain_type as chaintype, company_name as companyna[/td][/tr][tr][td]2[/td][td]1817414DB2ACF294[/td][td]0.098929[/td][td]2.162130[/td][td]21.9x[/td][td]select company_name as companyname, company_code as companycode, node_name as nodename, chain_type as chaintype, node_id[/td][/tr][tr][td]3[/td][td]E5BBE6425A7673A1[/td][td]0.028803[/td][td]1.629508[/td][td]56.6x[/td][td]select max(convert(peratiottm, decimal(?,?))) as maxperatiottm, min(convert(peratiottm, decimal(?,?))) as minperatiottm,[/td][/tr][tr][td]4[/td][td]A1A0A26E90628989[/td][td]0.004026[/td][td]1.594956[/td][td]396.2x[/td][td]select id ?, sectorid ?, psectorid ?, sname ?, py, ename ?, hqid ?, islastnode ? from platetree where psectorid = ? and [/td][/tr][tr][td]5[/td][td]17A797FA194A167D[/td][td]0.011527[/td][td]1.163998[/td][td]101.0x[/td][td]select f?,f?,f?,f? as pack from event?wheref?>= ? andf? |