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
    目录

    如果查询优化器选错了索引怎么办?

    MySQL 查询优化器因统计信息不准确、数据分布变化等原因,可能出现 “选错索引”(如放弃高效索引,选择低效索引或全表扫描),导致查询性能骤降,解决步骤如下:

    # 1. 确认优化器选错索引

    通过EXPLAIN查看执行计划,若出现以下情况,说明选错索引:

    • key字段显示的索引并非最优(如未使用过滤性更好的索引);
    • type字段为ALL(全表扫描),但存在可用索引;
    • rows字段预估扫描行数远大于实际需要扫描的行数。

    # 2. 解决方法(从简单到复杂)

    • 方法 1:更新统计信息:执行ANALYZE TABLE table_name,优化器依赖准确的统计信息选择索引,统计信息过期是选错索引的常见原因;

    • 方法 2:强制使用指定索引:用FORCE INDEX关键字强制 SQL 使用最优索引,临时解决问题;

      -- 强制使用idx_age索引
      SELECT * FROM user FORCE INDEX (idx_age) WHERE age > 20;
      
      1
      2
    • 方法 3:优化 SQL 语句:

      • 避免索引失效操作(如函数操作、模糊查询前缀通配符);
      • 调整查询条件顺序,让优化器更容易识别最优索引(如将过滤性强的条件放在前面);
      • 避免SELECT *,只查询需要的字段,提升索引覆盖概率;
    • 方法 4:调整索引结构:

      • 新增联合索引,覆盖查询条件和排序字段(如WHERE a=1 AND b=2 ORDER BY c,创建idx_a_b_c);
      • 删除低效索引或重复索引,减少优化器的选择难度;
    • 方法 5:调整 MySQL 优化器参数:

      • optimizer_switch:关闭某些优化规则(如set optimizer_switch='index_merge=off');
      • max_seeks_for_key:设置索引最大扫描次数,超过则选择全表扫描(需谨慎调整);
    • 方法 6:使用 hint 语句:除FORCE INDEX外,还可使用USE INDEX(推荐使用某索引)、IGNORE INDEX(忽略某索引);

      -- 推荐使用idx_age索引
      SELECT * FROM user USE INDEX (idx_age) WHERE age > 20;
      -- 忽略idx_name索引
      SELECT * FROM user IGNORE INDEX (idx_name) WHERE age > 20;
      
      1
      2
      3
      4

    # 3. 长期避免方案

    • 定期维护索引和统计信息(如每周执行ANALYZE TABLE);
    • 监控核心 SQL 的执行计划,发现异常及时干预;
    • 避免在生产环境中频繁修改表结构、索引或大量数据操作(可能导致统计信息过期)。

    上次更新: 12/30/2025
    有没有碰到过执行计划不一致的情况?
    当给第三方提供接口调用,需要注意哪些事情?

    ← 有没有碰到过执行计划不一致的情况? 当给第三方提供接口调用,需要注意哪些事情?→

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