Bohr-L Bohr-L
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

刘博

I'm a slow walker, But I never walk backwards.
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据处理与存储类

  • Spring 生态类

  • 缓存问题类

  • 多线程类

  • JVM 类

  • MySQL 类

  • Java 8 + 特性类

  • 其他技术类

    • 有没有碰到过执行计划不一致的情况?
      • 如果查询优化器选错了索引怎么办?
      • 当给第三方提供接口调用,需要注意哪些事情?
      • 接口防刷怎么实现?
      • 如果 JVM 出现频繁 FullGC 该如何解决
      • JVM OOM 问题如何排查和解决
      • CPU 使用率较高排查和解决
    • 常见面试题
    • 其他技术类
    刘博
    2025-12-29
    目录

    有没有碰到过执行计划不一致的情况?

    执行计划不一致是指 “同一 SQL 语句在不同时间、不同环境下,MySQL 优化器生成的执行计划不同”(如索引选择、关联顺序变化),导致查询性能波动(如从索引查询变为全表扫描),实际开发中较为常见,具体原因和解决如下:

    # 1. 执行计划不一致的常见原因

    • 统计信息过期:MySQL 优化器依赖表统计信息(如数据行数、索引 cardinality、数据分布)生成执行计划,若统计信息过期(如大量数据插入 / 删除后未更新),优化器会误判(如认为某索引过滤性好,实际很差);
    • 数据分布变化:表中数据分布改变(如某字段值从低基数变为高基数),优化器未感知,导致索引选择错误;
    • 参数配置变化:MySQL 参数(如optimizer_switch、max_seeks_for_key)修改,影响优化器决策逻辑;
    • SQL 语句变化:SQL 语句细微调整(如WHERE a=1 AND b=2改为WHERE b=2 AND a=1,虽逻辑相同,但优化器可能生成不同计划);
    • 环境差异:不同环境(开发 / 测试 / 生产)的表结构、索引、数据量不同,执行计划自然不同;
    • MySQL 版本差异:不同 MySQL 版本的优化器算法不同,对同一 SQL 的处理逻辑可能变化。

    # 2. 解决与避免方案

    • 更新统计信息:执行ANALYZE TABLE table_name,强制更新表统计信息,让优化器获取准确数据;
    • 锁定执行计划:用FORCE INDEX强制 SQL 使用指定索引(如SELECT * FROM user FORCE INDEX (idx_age) WHERE age>20),避免优化器选错索引;
    • 优化 SQL 语句:明确查询条件,避免模糊查询、函数操作,让优化器更容易选择最优索引;
    • 固定参数配置:统一开发 / 测试 / 生产环境的 MySQL 参数(尤其是优化器相关参数),减少环境差异影响;
    • 监控执行计划:定期用EXPLAIN查看核心 SQL 的执行计划,发现异常及时调整;
    • 避免过度索引:过多索引会增加优化器的选择难度,导致决策失误,需精简索引。

    #


    上次更新: 12/30/2025
    ArrayList、LinkedList、Vector 的区别?
    如果查询优化器选错了索引怎么办?

    ← ArrayList、LinkedList、Vector 的区别? 如果查询优化器选错了索引怎么办?→

    最近更新
    01
    CPU 使用率较高排查和解决
    12-29
    02
    JVM OOM 问题如何排查和解决
    12-29
    03
    接口防刷怎么实现?
    12-29
    更多文章>
    Theme by Vdoing | Copyright © 2025-2026 Bohr-L's note
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式