mysql索引优化从哪里入手_mysql调优步骤说明

发布时间 - 2026-01-31 00:00:00    点击率:
先看慢查询日志定位真实瓶颈,再用EXPLAIN分析执行计划;需开启慢日志、设long_query_time=1、关注频次×耗时、区分锁等待与真慢;EXPLAIN重点看type、key、Extra三列;索引要“刚好够用”,避免冗余、低基数、函数失效等问题;优化不能替代架构设计缺陷。

先看慢查询,再查执行计划——这是 MySQL 索引优化唯一靠谱的起点。 没有慢 SQL 日志和 EXPLAIN 输出,所有“加索引”“改字段”的操作都是蒙眼贴膏药。

从慢查询日志定位真实瓶颈

线上库不开启慢查询日志,等于开车不看油表。默认它关着,必须手动打开:

SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1; -- 超过1秒记为慢SQL
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

关键点:

  • long_query_time 建议设为

    1(秒),太低会刷屏,太高漏掉隐患;
  • 日志路径需确保 MySQL 进程有写权限,否则静默失败;
  • 别只盯单条 SQL 的耗时——要关注 频次 × 平均耗时,高频中等耗时的语句往往比低频超长语句更伤性能;
  • 注意区分是“锁等待”还是“真慢”,Rows_examinedLock_time 在日志里都带出来,别只看 Query_time

用 EXPLAIN 看懂索引到底用没用上

对慢 SQL 执行 EXPLAIN,重点盯三列:typekeyExtra

  • type = ALL:全表扫描,紧急加索引或重构查询;
  • key = NULL:明明建了索引却没走,大概率是 WHERE 条件用了函数、隐式类型转换或 OR 拆分失效;
  • Extra 出现 Using filesortUsing temporary:排序/分组没走索引,得补 ORDER BY 字段到复合索引末尾;
  • key_len 值比预期小:说明只用了复合索引前缀,检查 WHERE 是否满足最左前缀法则。

示例:

EXPLAIN SELECT name, age FROM user_info WHERE name = 'xys' AND age > 20 ORDER BY age;

理想情况:key = name_index(假设你建的是 (name, age) 复合索引),Extrafilesort;如果 key = NULL,就该查查 name 字段是不是被 UPPER(name) 包裹了。

建索引不是越多越好,而是“刚好够用”

索引是双刃剑:读快了,写就慢;空间占了,缓存就挤。建之前问自己三个问题:

  • 这个字段在 WHEREJOINORDER BYGROUP BY 里高频出现吗?没出现就别建;
  • 它的基数(distinct 值数量)够高吗?比如 status 只有 '0'/'1',建索引几乎无效;
  • 是否能合并?比如已有 (a, b) 索引,就别单独再建 a 单列索引——它已被覆盖。

常见误操作:

  • VARCHAR(255) 字段直接建全文索引——除非真做模糊搜索,否则优先考虑前缀索引:INDEX idx_name (name(10))
  • DATETIME 字段上建单列索引却总查 DATE(create_time)——函数导致索引失效,应改用范围查询:create_time >= '2025-12-01' AND create_time ;
  • TEXT 或大 JSON 字段建普通索引——MySQL 不支持,得用生成列 + 索引或全文索引。

索引维护比创建更重要

索引不是一劳永逸。InnoDB 的 B+Tree 在大量增删后会碎片化,SELECT 效率下降,但 SHOW INDEX 看不出异常:

  • 定期检查索引碎片率:SELECT table_name, data_free / data_length AS frag_ratio FROM information_schema.tables WHERE table_schema = 'your_db';,> 0.3 就该考虑重建;
  • 重建索引别用 DROP + CREATE——锁表。用 ALTER TABLE t ENGINE=InnoDB;(在线 DDL,MySQL 5.6+ 支持);
  • 删除无用索引前,先用 sys.schema_unused_indexes 视图(需启用 performance_schema)确认它真没人用;盲目删可能让某条夜间报表 SQL 突然变慢十倍。

最后提醒一句:索引优化解决不了设计缺陷。如果一张表连主键都没有、或者 JOIN 总是跨 5 张大表,加再多索引也只是延缓崩溃——该拆表拆表,该加冗余加冗余,别拿索引当创可贴。


# mysql  # js  # json  # ai  # mysql索引  # 隐式类型转换  # 2025  # sql  # 架构  # NULL  # select  # date  # using  # 类型转换  # table  # 重构  # 就该  # 先看  # 就别  # 的是  # 都是  # 这是  # 一句  # 已有  # 已被  # 没人 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在Windows虚拟主机上快速搭建网站?  Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  如何用AWS免费套餐快速搭建高效网站?  如何在云指建站中生成FTP站点?  长沙企业网站制作哪家好,长沙水业集团官方网站?  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  Laravel如何使用Service Container和依赖注入?(代码示例)  Bootstrap整体框架之CSS12栅格系统  高防服务器如何保障网站安全无虞?  晋江文学城电脑版官网 晋江文学城网页版直接进入  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  手机网站制作与建设方案,手机网站如何建设?  5种Android数据存储方式汇总  如何在Windows环境下新建FTP站点并设置权限?  重庆市网站制作公司,重庆招聘网站哪个好?  网站制作免费,什么网站能看正片电影?  ,怎么在广州志愿者网站注册?  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  Python文件流缓冲机制_IO性能解析【教程】  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何在阿里云香港服务器快速搭建网站?  如何在IIS中新建站点并解决端口绑定冲突?  如何在阿里云服务器自主搭建网站?  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Android okhttputils现在进度显示实例代码  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  如何在局域网内绑定自建网站域名?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  如何在腾讯云服务器上快速搭建个人网站?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  JavaScript如何操作视频_媒体API怎么控制播放  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  Android仿QQ列表左滑删除操作  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  Laravel集合Collection怎么用_Laravel集合常用函数详解  在线制作视频网站免费,都有哪些好的动漫网站?  浅谈javascript alert和confirm的美化  用yum安装MySQLdb模块的步骤方法