SQL 慢就 force index?先问优化器为什么不听你的
force index 的正确打开方式以及它的三个代价遇到慢 SQL很多人的第一反应是用force index指定一个索引。写法简单改完立刻见效所以很受欢迎。但我的观点是**force index 是“最后一招”不是“第一招”。**它只是让优化器闭嘴没有回答最重要的问题它为什么没选你想要的索引下面先讲基本用法再讲五个我认为更重要的判断为什么没走、走索引不等于快、强制索引的代价、该用哪种提示以及大表 count 慢的真正原因。01基本用法先 explain再决定第一步永远是用explain分析 SQL看优化器实际选了什么explain select count(id) from person_info_large;重点看几列type访问类型、key实际使用的索引、rows预估扫描行数、Extra如Using index、Using filesort、Using temporary。如果想让 SQL 走指定的索引可以用force index主键索引的名字固定叫PRIMARYexplain select count(id) from person_info_large force index (primary);改完再 explain 一次对比前后key和rows的变化。02观点一先查“为什么没走”再谈“强制走”优化器没选你想要的索引通常有原因。强制索引前先排除这几类原因表现正确的处理统计信息过期预估行数和实际差很多选错索引对表执行ANALYZE TABLE更新统计信息索引选择性差索引列重复值很多优化器认为不如全表扫描换更有区分度的列或联合索引写法让索引失效列上用了函数、隐式类型转换、前导通配符like %xx改写 SQL让条件能用上索引索引设计不合理联合索引不满足最左前缀调整索引而不是调整提示这些原因里大部分改 SQL 或改索引就能根治。force index 对这些问题都是绕过不是修复。03观点二走了索引不等于更快这是原文最容易让人误解的地方。看到key列有值就以为问题解决了。但以count为例InnoDB 的主键索引是聚簇索引叶子节点存的是整行数据二级索引的叶子节点只存索引列加主键体积通常小得多。统计行数时优化器往往会倾向选择更小的二级索引去扫描因为读的页更少。判断如果你强制它走主键反而可能比优化器自己的选择更慢因为要扫描体积更大的聚簇索引。具体是否如此要看你的表结构和数据以实际耗时为准。做法别只看key要对比rows和真实执行时间。较新的 MySQL 8.0 版本支持explain analyze会给出实际执行耗时更适合验证。04观点三force index 的代价往往被低估取在优化器明显误判、线上要紧急止血时force index 是有效手段改动小、见效快。舍一写死了索引名以后索引改名、删除或重建SQL 会直接报错提示找不到该索引而且这种错误常常到上线后才暴露。舍二数据分布会变今天对的强制索引数据量或分布变化后可能变成最差的选择而优化器已经被你禁止重新判断。舍三难以维护散落在代码或 ORM 里的索引提示换个人接手没人知道为什么写也没人敢删。所以如果必须用请在代码旁写清楚原因、日期和验证结果并在文档里登记方便日后复查。05观点四分清三种提示用对工具写法含义适用FORCE INDEX (idx)强烈要求使用该索引除非实在无法使用否则不再考虑全表扫描优化器明显误判时USE INDEX (idx)建议优化器只在指定的索引中选择不保证一定使用想缩小选择范围但仍保留弹性IGNORE INDEX (idx)让优化器不要用某个索引某个索引总被错选MySQL 8.0 还支持 Optimizer Hint 语法写在/* ... */里如INDEX、NO_INDEX粒度更细也更便于按语句管理。具体语法请以你的 MySQL 版本文档为准。06观点五大表 count 慢是结构问题不是索引问题原文的例子是对一张大表执行count(id)。要明白InnoDB 不像 MyISAM 那样保存精确行数统计行数需要真实扫描。表越大count 越慢这是引擎的特性不是索引选错了。与其纠结用哪个索引不如换个思路近似值如果业务能接受估算可以用information_schema中的预估行数或show table status速度快但不精确。汇总表或计数器在写入时同步维护一个计数查询时直接读取。缓存用 Redis 缓存统计结果设置合理的过期或更新策略。加条件带过滤条件的 count让条件走上合适的索引缩小扫描范围。一句话总结遇到慢 SQL按这个顺序处理先explain看现状再查为什么没走索引优先改 SQL、改索引、更新统计信息最后才考虑 force index并用真实耗时验证、写清原因。强制索引不是答案只是止血。说明本文示例基于 MySQLInnoDB不同版本的优化器行为和语法可能有差异请以实际环境的 explain 结果和官方文档为准。用 force index()指定想要走的索引一、使用explain工具分析sqlexplain select count(id) from person_info_large;二、修改sql或者尽量让sql走索引explain select count(id) from person_info_largeforce index(primary);

相关新闻

TradingAgents vs AutoGen vs LangGraph:谁才是 AI 交易圈的顶配底座

TradingAgents vs AutoGen vs LangGraph:谁才是 AI 交易圈的顶配底座

TradingAgents vs AutoGen vs LangGraph:谁才是 AI 交易圈的顶配底座 【免费下载链接】TradingAgents-AI.github.io TradingAgents: Multi-Agents LLM Financial Trading Framework 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-AI.github.io…

2026/10/10 7:36:25 阅读更多 →
多智能体协作实战:从提示词堆砌到团队化分工调度

多智能体协作实战:从提示词堆砌到团队化分工调度

做AI应用这些年,我越来越觉得“单智能体包打天下”这个思路在真实业务约束下并不可靠。最近我搭了一套内部代号叫agency-agents的模拟项目,核心就是让多个智能体像一个小团队一样分工协作。它解决的场景很典型:一次任务里既要做资料搜集&…

2026/10/10 7:35:25 阅读更多 →
基于Python的Django+Flask畜牧站疾病防控与检测系统实战解析

基于Python的Django+Flask畜牧站疾病防控与检测系统实战解析

做基层畜牧站的信息化项目,最头疼的不是算法,而是把一堆琐碎的防疫流程理顺。最近在开发一个基于Python的畜牧站疾病防控与检测系统,技术栈选了DjangoFlask这个组合。很多人第一反应是“一个项目为什么要混用两个框架”,其实真正落…

2026/10/10 7:35:25 阅读更多 →

最新新闻

syzkaller aflow 中的 AI 驱动崩溃复现器(Crash-to-Repro)工作流:从内核崩溃报告到 syzlang 程序

syzkaller aflow 中的 AI 驱动崩溃复现器(Crash-to-Repro)工作流:从内核崩溃报告到 syzlang 程序

网络安全开发工具质量保障 【免费下载链接】syzkaller syzkaller is an unsupervised coverage-guided kernel fuzzer 项目地址: https://gitcode.com/gh_mirrors/sy/syzkaller 点击查看 免费下载 导读 本文基于 syzkaller 仓库中 pkg/aflow/docs/crash-to-repro.…

2026/10/10 8:25:54 阅读更多 →
GDPR合规实战:用pytest构建数据泄露检测自动化测试

GDPR合规实战:用pytest构建数据泄露检测自动化测试

GDPR的合规压力这些年是真切地压在了每一个做数据处理的产品团队身上。尤其是“数据泄露检测”这件事,绝大多数团队并不是不想做好,而是卡在了一个很现实的困境:检测规则写了、监控告警配了、漏报分析也做了,但怎么证明这套机制在…

2026/10/10 8:25:54 阅读更多 →
图论综合题拆解:DFS、BFS、并查集与拓扑排序的算法选择指南

图论综合题拆解:DFS、BFS、并查集与拓扑排序的算法选择指南

1. 从图论专题1到专题5,这一路究竟在练什么代码随想录算法训练营走到 day52,图论专题5 差不多是整个图论模块里最重要的一次“串讲型”练习。前面专题1到专题4分别解决“图怎么存、图怎么扫、连通块怎么数、集合怎么并”这几个基础问题,到了第…

2026/10/10 8:25:53 阅读更多 →
ubuntu20虚拟机网卡突然没了

ubuntu20虚拟机网卡突然没了

sudo lshw -c networksudo service NetworkManager stopsudo rm /var/lib/NetworkManager/NetworkManager.state#不喜欢vim的也可以用ubuntu20、22自带的gedit sudo vim /etc/NetworkManager/NetworkManager.conf #打开.conf文件后,找到里面的managed,…

2026/10/10 8:25:53 阅读更多 →
iSpring 前端面试题「Пятнашки」:React Hooks + TypeScript 实现可解 15 拼图实战指南

iSpring 前端面试题「Пятнашки」:React Hooks + TypeScript 实现可解 15 拼图实战指南

教程 【免费下载链接】ru-test-assignments Тестовые задания для самостоятельного выполнения от разных it компаний 项目地址: https://gitcode.com/gh_mirrors/ru/ru-test-assignments 点击查看 …

2026/10/10 8:25:53 阅读更多 →
AlgoNote 算法通关手册:LeetCode 0955「删列造序 II」贪心题解与逐列状态标记法详解

AlgoNote 算法通关手册:LeetCode 0955「删列造序 II」贪心题解与逐列状态标记法详解

教程文档知识库 【免费下载链接】AlgoNote ⛽️「算法通关手册」:从零开始的「算法与数据结构」学习教程,200 道「算法面试热门题目」,1000 道「LeetCode 题目解析」,持续更新中! 项目地址: https://gitcod…

2026/10/10 8:24:53 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →