mysql中索引创建与查询优化中的实践经验

发布时间 - 2026-02-01 00:00:00    点击率:
应为能显著缩小结果集且查询频繁的字段建索引,如 user_id、status、created_at;避免对低基数、JSON(未建函数索引)、违反最左前缀的字段建索引。

什么时候该给 WHERE 字段加索引?

不是所有 WHERE 条件字段都值得建索引。真正需要建索引的,是那些能显著缩小结果集、且查询频率高的字段。比如 user_idstatus(值分布较均匀)、created_at(范围查询多)——这些在 EXPLAI

N 中常表现为 type=refrange 的字段。

容易踩的坑:
• 对 is_deleted TINYINT(1) 这类低基数字段(比如 95% 是 0)建单列索引,MySQL 很可能直接放弃使用;
• 在 JSON 字段上用 WHERE data->'$.name' 查询却不建函数索引,会导致全表扫描;
• 忘记索引最左前缀原则:对 (a,b,c) 建联合索引后,WHERE b = ? 不会走索引。

ORDER BYLIMIT 组合为什么慢?怎么加速?

当查询带 ORDER BY created_at DESC LIMIT 20,但 created_at 没有索引,或索引没覆盖 WHERE 条件时,MySQL 可能先取出全部匹配行再排序,内存或磁盘临时表开销极大。

实操建议:
• 把 WHERE 条件字段和 ORDER BY 字段合并进一个联合索引,顺序按「等值条件 → 最左前缀 → 排序字段」排列,例如:WHERE status = 1 AND is_valid = 1 ORDER BY updated_at DESC → 索引应为 (status, is_valid, updated_at)
• 避免在 ORDER BY 中使用函数或表达式,如 ORDER BY DATE(created_at),除非你建了函数索引;
• 如果分页很深(如 LIMIT 10000, 20),考虑用游标分页(记录上一页最大 updated_at 值),避免 OFFSET 跳过大量行。

为什么 ALTER TABLE ... ADD INDEX 会锁表?如何安全加索引?

MySQL 5.6+ 默认使用 ALGORITHM=INPLACE,但并非所有操作都免锁。比如在大表(千万级)上对未压缩的 TEXT 字段建前缀索引,仍可能触发重建表(COPY 算法),造成写阻塞。

关键判断点:
• 先执行 ALTER TABLE t ADD INDEX idx_name (col) ALGORITHM=INPLACE, LOCK=NONE;,如果报错提示不支持,说明必须降级为 LOCK=SHARED 或等待维护窗口;
• 使用 pt-online-schema-change 工具做在线 DDL,它通过影子表 + 触发器同步数据,但要注意主从延迟和触发器性能开销;
• 在 RDS(如阿里云 PolarDB、AWS RDS)上,部分版本支持“在线创建二级索引”特性,需确认实例版本和参数 innodb_online_alter_log_max_size 是否足够。

EXPLAIN 输出里哪些字段最值得盯?

别只看 type 是不是 ALL,重点盯这三列:key(实际用了哪个索引)、rows(预估扫描行数)、Extra(有没有 Using filesortUsing temporary)。

典型信号:
keyNULL:没走索引,检查字段类型是否隐式转换(如 varchar 字段传入数字);
rows 远大于实际返回行数(比如 rows=500000LIMIT 10):说明索引选择性差或统计信息过期,可运行 ANALYZE TABLE t;
Extra 出现 Using index condition 是好现象(ICP,索引下推),但若同时出现 Using where; Using index,说明是覆盖索引,不用回表;
type=rangerows 极大:可能是范围太宽(如 created_at > '2025-01-01'),考虑分区或更精确的过滤条件。

EXPLAIN SELECT * FROM orders 
WHERE user_id = 12345 AND status IN (1,2) 
ORDER BY created_at DESC LIMIT 10;

索引设计是否合理,就看这一条 EXPLAINkey 是否命中、rows 是否可控、Extra 有没有刺眼的警告。


# mysql  # js  # json  # go  # 工具  # 阿里云  # ai  # 报错提示  # 排列  # 隐式转换  # 为什么  # red  # NULL  # date  # using  # copy  # table  # 算法  # 分页  # 行数  # 这一  # 上一页  # 什么时候  # 用了  # 这类  # 很可能  # 不支持  # 就看 


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


相关推荐: Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  canvas 画布在主流浏览器中的尺寸限制详细介绍  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  如何快速重置建站主机并恢复默认配置?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  网站建设保证美观性,需要考虑的几点问题!  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  如何制作一个表白网站视频,关于勇敢表白的小标题?  如何在云主机上快速搭建多站点网站?  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  济南网站建设制作公司,室内设计网站一般都有哪些功能?  Android滚轮选择时间控件使用详解  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  详解Oracle修改字段类型方法总结  JavaScript如何实现路由_前端路由原理是什么  如何彻底删除建站之星生成的Banner?  Laravel如何自定义分页视图?(Pagination示例)  如何快速生成ASP一键建站模板并优化安全性?  googleplay官方入口在哪里_Google Play官方商店快速入口指南  如何在Windows虚拟主机上快速搭建网站?  如何在服务器上三步完成建站并提升流量?  如何快速搭建高效可靠的建站解决方案?  iOS正则表达式验证手机号、邮箱、身份证号等  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  魔方云NAT建站如何实现端口转发?  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  如何在 Pandas 中基于一列条件计算另一列的分组均值  手机网站制作与建设方案,手机网站如何建设?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  jQuery中的100个技巧汇总  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  Laravel如何实现事件和监听器?(Event & Listener实战)  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  如何用JavaScript实现文本编辑器_光标和选区怎么处理  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  Laravel如何实现本地化和多语言支持?(i18n教程)