MariaDB 10.11迁移至11.0后特定查询性能下降问题排查
低侵入性修复MariaDB 11.0查询执行计划异常方案
1. 强制指定索引(查询级适配)
- 无需修改原有查询逻辑,给目标查询添加
FORCE INDEX提示,指定10.11版本中使用的a表索引。示例:SELECT ... FROM a FORCE INDEX (idx_a_filter) JOIN o ON ... WHERE ...; - 若应用端无法直接修改SQL,可借助MariaDB的查询重写插件实现自动替换,无需改动应用代码:
INSTALL SONAME 'query_rewrite'; INSERT INTO query_rewrite.rewrite_rules (original_query, rewritten_query) VALUES ('原查询语句', '添加FORCE INDEX后的查询语句'); FLUSH QUERY REWRITE RULES;
2. 调整优化器参数(实例级适配)
- MariaDB 11.0的优化器成本估算模型可能有调整,可通过以下参数引导优化器倾向索引扫描:
- 关闭基于成本的全表扫描决策:
SET GLOBAL optimizer_switch='table_scan_cost_based=off';(临时生效,需写入my.cnf/my.ini永久生效) - 降低索引扫描的成本系数:
SET GLOBAL index_merge_sort_intersection_cost=1;(可根据实际查询性能微调)
- 关闭基于成本的全表扫描决策:
- 注意:修改全局参数会影响所有查询,建议先在测试环境验证后再部署到生产。
3. 手动更新表统计信息
- 尽管执行过
mysqlcheck,手动触发统计信息更新可能让优化器重新计算执行计划:ANALYZE TABLE a, o; - 针对大型表,可生成持久化统计信息避免反复计算:
ANALYZE TABLE a, o PERSISTENT FOR ALL;
4. 回退优化器行为(版本兼容)
- MariaDB 11.0支持通过参数回退到10.11版本的优化器逻辑:
SET GLOBAL optimizer_switch='old_optimizer=on'; - 该设置会让优化器采用接近旧版本的决策规则,无需修改查询或表结构。
内容的提问来源于stack exchange,提问作者Serhii
相关产品推荐
相关产品推荐

