MySQL 是否在扫描额外的记录
衡量查询开销的指标#
- 响应时间
- 扫描的行数
- 返回的行数
它们大致反映了MySQL在内部执行查询时,需要访问多少数据,可以大概推算出查询运行的时间
响应时间#
响应时间 = 服务时间 + 排队时间
使用快速上限估计法,来查询响应时间
扫描的行数和返回的行数字#
分析查询时,查看该查询扫描的行数很有帮助,理想情况下扫描的行数和返回的行数应该是相同的
但例如在做一个关联查询时,服务器必须要扫描多行才能生成结果集中的一行
扫描的行数和访问类型#
有些访问方式可能需要扫描很多行才能返回一行结果,有些访问方式可能无须扫描就能返回结果
在EXPLAIN语句中的type列反映了访问类型
- 全表扫描
- 范围扫描
- 唯一索引查询
- 常数引用
EXPLAIN的结果也显示MySQL预估需要访问10行数据
删掉索引之后,变成了一个全表扫描
MySQL通过WHERE条件筛选存储引擎返回的记录
以下三种方式应用WHERE条件,从好到坏依次为#
- 在索引中使用WHERE条件过滤不匹配的记录,这是在存储引擎层完成的
- 使用索引覆盖扫描(Extra列中出现了Using index)返回记录,直接从索引中过滤不需要的记录返回命中结果
- 从数据表中返回数据,过滤不满足条件的记录Extra列中出现了Using index)
然后并不是说增加索引就能让扫描的行数等于返回的行数
查询数量需要读取几千行数据,但仅返回几百行,没有什么索引能够让这样的查询减少需要扫描的行数
查询需要扫描大量的数据但只返回少数的行#
- 使用索引覆盖扫描,把所有需要用的列都放到索引中,存储引擎便无须回表扫描
- 改变库表结构,例如使用单独的汇总表
- 重写复杂查询,让MySQL优化器能够以更优化的方式执行这个查询
作者:BigBender
出处:https://www.cnblogs.com/BigBender/p/15465839.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!