force index强制使用指定索引
问题:对于一个8000w数据量并有索引的表进行查询,查询了5分钟才查询出结果
产生问题的原因:索引失效。 数据表中数据量非常大,而查询条件只有时间区间。(因为是>= 和 <= 无法使用索引)
SELECT 字段一, 字段二, 字段三, 字段四, 字段五, 字段六
FROM 表一 INNER JOIN 表二 ON 关联条件 INNER JOIN 表三 ON 关联条件 INNER JOIN 表四 ON 关联条件
WHERE 表一.created
>= '2019-07-09 00:00:00' AND 表一.created
<= '2019-07-30 23:59:59' ORDER BY 表一.created
DESC
执行explain,发现该查询检索了全表8000w的数据。
如上图索引失效,并未使用created字段作为查询索引,而是一个联合索引对查询优化并无作用。 造成索引失效的原因有哪些,请看这表文章()
force index(表一_字段)
SELECT 字段一, 字段二, 字段三, 字段四, 字段五, 字段六 FROM 表一 force index(表一_字段) INNER JOIN 表二 ON 关联条件 INNER JOIN 表三 ON 关联条件 INNER JOIN 表四 ON 关联条件
WHERE 查询条件一 AND 查询条件二(表一.created
>= '2019-07-09 00:00:00' AND 表一.created
<= '2019-07-30 23:59:59') ORDER BY 表一.created
DESC
添加了强制索引后再执行explain,这次只检索了满足查询条件的110w条数据。
如图,这次就使了created字段作为索引。查询的数据量明显减少,并且使用了created字段作为索引。
注意:mysql优化器会计算出一个合适的索引,但是这个索引不一定是最好的。force index()指令可以避免MySql优化器用到了一个低效的索引。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律