基于在MySQL核心代码的多年技术积淀和源码掌控能力,万里数据库研发工程师先分析现场业务的网络抓包,再根据抓包中的SQL逻辑编写复现程序,果然准确地复现了问题场景,然后结合源码分析复现场景中m_prebuilt->m_end_range变量的变化,最后分析出造成查询结果集提前返回的原因和条件。
通过一套完整的方法论和专业缜密的源码分析、测试,最终梳理出触发条件需满足的几点关键规律:
1. SQL 使用x≥a and x≤b 或 x between a and b的范围查询,执行计划使用 range scan;
2.满足x≥a and x≤b 或 x between a and b查询条件的记录数≥4条;
3.假设 x>b 的记录数,其中已commit的记录数为m,未commit的记录数为n,m=[1,8),(m+n)≥100;
4.x 为索引字段。
04验证:评估验证 确定结果
经各业务部门多次验证评估,只有本业务作业满足上述条件,才会触发bug#91032。客户经过分析对比发现:在所有数据库厂商给出的源码分析结果中,万里数据库给出的这几条关键触发规律是最精准且有效的。
基于此,得到准确结果后的客户,大大消除了心中疑虑,知晓了后续正确的应对方式,从而规避bug出现,挽回业务损失。
而万里工程师也凭借在这次问题分析中的杰(tong)出(xiao)表现,用专业过硬的技术能力征服了客户,获得客户由衷认可。
揭秘:万里数据库为何具备如此强大的MySQL源码掌控能力?
万里数据库于2006年成为MySQL中国研发中心和MySQL中国教育中心。MySQL中国研发中心作为MySQL全球研发队伍的重要组成部分,参与到当时最新的MySQL产品开发之中,是中国技术团队首次进入国际知名开源基础软件核心开发领域的典型代表,对MySQL核心源代码拥有强大的掌控力。
作为原MySQL中国研发中心,万里数据库不仅对MySQL源码和技术服务积淀深厚,还完全继承了MySQL技术路线最成熟的技术生态和语法、兼容性等,沉淀了MySQL源码服务、MySQL运维工具、MySQL支持服务三大维度七个模块的MySQL技术能力体系,可为MySQL用户在数据库使用、数据库迁移、数据库运维、数据库咨询等问题上提供高质量的定制化解决方案。
▲ 万里数据库-MySQL技术能力体系
得益于公司在MySQL技术路线的多年技术研发与沉淀,万里数据库自主研发的商业数据库产品GreatDB,历经十多年打磨,不仅完美继承了MySQL技术生态,可帮助用户以最少代价、无缝平滑地将MySQL迁移到GreatDB安全数据库,业务改造工作量最少,改造成本接近于0。
同时,GreatDB灵活的集中式及分布式架构部署切换模式、高安全、高性能等优势特性,能满足客户复杂业务系统中的数据库替换需求,且提供一系列配套的迁移和运维管理工具,即0成本就能完成数据库迁移工作,积累了多个重点行业的头部大型企业客户案例,助力各行业数字化进程加速发展。
此外,2021年,万里数据库基于自身MySQL技术路线的积累,主导成立了GreatSQL开源数据库社区,持续投入人力物力资源,推动GreatSQL这一MySQL技术路线的开源数据库持续更新迭代,至今已完成6个版本更新升级。与此同时,得益于GreatSQL的开源贡献度、社区活跃度等因素,GreatSQL社区于2023年成功捐赠给开放原子开源基金会,成为其旗下孵化开源项目,并获得中国信通院可信开源社区+可信开源项目双认证,延续MySQL技术路线贡献,持续回馈社会。
05番外:后续操作指南
根据MySQL5.7.24版本的提交日志,可以查看bug#91032的修复:
commit 94208bcb882860f9f21e1a0d1e600cce268e1203
Author: Jimmy Yang
Date: Wed Jun 13 18:10:12 2018 -0700
Fix Bug#28104394 - INNODB 5.7 PRIMARY KEY SCAN LACK DATA
Reviewed-by: Sunny Bains
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index ff82775ac7a..9b574c70f9a 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -3235,6 +3235,7 @@ ha_innobase::reset_template(void)
m_prebuilt->keep_other_fields_on_keyread = 0;
m_prebuilt->read_just_key = 0;
m_prebuilt->in_fts_query = 0;
+ m_prebuilt->m_end_range = false;
* Reset index condition pushdown state. */
if (m_prebuilt->idx_cond) {
实际上,每次SQL执行完成后,需要把相关的标志位正常重置。但对于生产环境而言,就需要合入该patch或升级到5.7.24及以上版本了,升级的处理办法可点击阅读原文查看具体方案。
参考链接
1.InnoDB 5.7 Primary key scan lack data:https://bugs.mysql.com/bug.php?id=91032
2.项目后续-合入修复patch并编译与官方一致的Linux_Generic包:
https://mp.weixin.qq.com/s/d2v_2KIhA0vEL8L4boASTQ