开发者社区 问答 正文

阿里云 MySQL 慢查询定位和索引优化是怎么进行的?

阿里云 MySQL 慢查询定位和索引优化是怎么进行的?

展开
收起
云渠道商yunshuguoji 2026-07-21 14:00:51 22 分享 版权
1 条回答
写回答
取消 提交回答
  • 专注分享|知识干货|避坑指南 有注册开户类、云领域知识等不了解的问题可以问我哦

    本文由云服务器代理商:云枢国际yunshuguoji撰写。
    第一部分:开启慢日志,定位慢 SQL
    步骤 1:开启慢查询日志
    进入 RDS 实例详情页 → 参数设置
    搜索参数:
    slow_query_log:改为 ON(开启慢日志)
    long_query_time:推荐设 1(执行超过 1 秒即记录)
    log_output:FILE(日志存入文件)
    保存参数修改,重启实例生效(测试低峰操作)

    步骤 2:下载 / 查看慢日志文件
    实例详情 → 日志管理 → 慢日志
    筛选时间范围,点击下载日志文件
    日志内可直观看到:执行 SQL、耗时、扫描行数、访问时间

    步骤 3:可视化分析(推荐,不用读日志文本)
    进入「性能洞察 / CloudDBA」
    选择慢 SQL 分析,系统自动聚合:耗时 Top SQL、扫描行数过大语句、高频重复查询
    重点标记两类高危语句:
    单次执行耗时>3s
    扫描行数几十万,但返回结果极少(无索引)

    第二部分:验证 SQL 缺少索引(Explain 分析)
    RDS 控制台打开「SQL 执行窗口」,输入慢 SQL
    语句前加 EXPLAIN 执行,查看返回结果关键字段:
    type:出现 ALL → 全表扫描,必须加索引
    rows:扫描行数巨大
    key:NULL,代表当前无可用索引

    第三部分:索引优化实操方案
    方案 1:普通单列索引(等值查询,如手机号、订单号)
    执行语句:
    CREATE INDEX idx_字段 ON 表名(字段);
    方案 2:联合复合索引(多条件筛选,where a=? and b=?)
    CREATE INDEX idx_ab ON 表(a,b);
    规则:等值字段放前面,范围条件(> < like)放末尾
    方案 3:前缀索引(长文本、商品标题)
    CREATE INDEX idx_title ON goods(title(64));
    方案 4:删除无用冗余索引
    CloudDBA 索引分析会提示重复、长期未使用索引
    删除语句:DROP INDEX 索引名 ON 表名;

    第四部分:优化后校验
    再次用 EXPLAIN 执行原慢 SQL
    type 变为 range/ref,key 显示新建索引名
    回到性能洞察观察:平均执行耗时明显下降、CPU 负载降低

    2026-07-21 14:16:47
    赞同 103 展开评论
问答分类:
问答地址: