当前位置: 首页 > article >正文

【MySQL百日打怪升级第8天】SELECT执行流程

【第8天】每天一个MySQL知识点百日打怪升级SQL基础SELECT执行流程大家好我是一名拥有10年以上经验的DBA老兵。做这个系列源于一个朴素的愿望把踩过的坑、总结的经验系统化输出希望能帮到刚入行或想进阶的兄弟们。让我们开始今天的第8天内容。面试考点SELECT 语句从输入到输出经历了哪些步骤查询缓存为什么在 MySQL 8.0 被移除了优化器是怎么选择索引的执行器是怎么获取数据的背景引入 说白了你以为 SELECT 只是查一下其实它跑了半个数据库你有没有想过你敲下SELECT * FROM user WHERE id 1MySQL 到底做了什么为什么有时候明明加了索引MySQL 却不用为什么同样的 SQL有时候快有时候慢说实话不理解 SELECT 执行流程的 DBA就像不知道汽车怎么跑的司机——能开但出了问题只能干瞪眼。今天的目标搞懂 SELECT 语句的完整执行流程面试必问。核心概念执行流程全景图┌──────────────────────────────────────────────────────────────┐ │ SELECT 执行流程 │ ├──────────────────────────────────────────────────────────────┤ │ │ │ 客户端 │ │ ↓ │ │ ┌─────────┐ │ │ │ 连接器 │ ← 权限验证、获取连接 │ │ └────┬────┘ │ │ ↓ │ │ ┌─────────┐ │ │ │ 查询缓存│ ← MySQL 8.0 已移除 │ │ └────┬────┘ │ │ ↓ │ │ ┌─────────┐ │ │ │ 解析器 │ ← 词法分析、语法分析 │ │ └────┬────┘ │ │ ↓ │ │ ┌─────────┐ │ │ │ 预处理器│ ← 检查表/列是否存在、权限验证 │ │ └────┬────┘ │ │ ↓ │ │ ┌─────────┐ │ │ │ 优化器 │ ← 选择索引、决定执行计划 │ │ └────┬────┘ │ │ ↓ │ │ ┌─────────┐ │ │ │ 执行器 │ ← 调用存储引擎获取数据 │ │ └────┬────┘ │ │ ↓ │ │ 结果集 │ │ │ └──────────────────────────────────────────────────────────────┘第一步连接器说白了连接器就是门卫验明正身才让进职责建立 TCP 连接验证用户名密码获取用户权限后续操作都依赖这个权限面试必问为什么有时候连接很慢长连接和短连接有什么区别为什么长连接会导致内存泄漏面试解答Q: 为什么有时候连接很慢因为建立 TCP 连接需要三次握手如果数据库服务器距离远或者网络差连接就会慢。建议使用连接池复用连接。Q: 长连接和短连接有什么区别短连接每次执行完 SQL 就断开连接。长连接执行完 SQL 后保持连接下次复用。长连接减少了建立连接的开销但会导致内存增长。第二步查询缓存MySQL 8.0 已移除说白了查询缓存就是抄作业SQL 完全一样就直接返回结果工作机制检查 SQL 是否命中缓存精确匹配包括空格命中 → 直接返回结果未命中 → 继续执行后续步骤结果放入缓存为什么 MySQL 8.0 移除了缓存失效太频繁表有任何更新该表所有缓存失效命中率低业务 SQL 通常有参数差异维护成本高需要额外的锁机制-- MySQL 5.7 可以手动关闭查询缓存SETGLOBALquery_cache_type0;-- 查看缓存状态SHOWSTATUSLIKEQcache%;第三步解析器说白了解析器就是语文老师检查 SQL 语法对不对职责词法分析识别关键字、表名、列名语法分析检查 SQL 语法是否正确-- 语法错误示例SELEC*FROMuser;-- 报错SELEC 不是有效关键字-- 语义错误示例解析器检查不出在预处理器报错SELECT*FROMuserWHEREnon_exist_column1;-- 如果列不存在在预处理器报错第四步预处理器说白了预处理器就是班主任检查表和列是否存在职责检查表名、列名是否存在检查用户是否有权限访问这些表和列展开SELECT *为具体列名-- 预处理器会检查SELECT*FROMuserWHEREage18;-- 等价于SELECTid,name,age,...FROMuserWHEREage18;第五步优化器说白了优化器就是军师决定怎么执行最高效职责选择使用哪个索引决定表的连接顺序选择最优的执行计划优化器的工作原理-- 优化器会考虑以下因素EXPLAINSELECT*FROMuserWHEREage18ANDcity北京;-- 优化器可能选择-- 方案1使用 idx_age 索引然后回表过滤 city-- 方案2使用 idx_city 索引然后回表过滤 age-- 方案3使用联合索引 idx_age_city如果存在面试必问优化器是基于什么选择索引的优化器选择错了怎么办面试解答Q: 优化器是基于什么选择索引的基于统计信息cardinality、数据分布等估算成本选择成本最低的执行计划。但统计信息可能不准确导致优化器选错索引。Q: 优化器选择错了怎么办可以使用FORCE INDEX强制指定索引或者ANALYZE TABLE更新统计信息。第六步执行器说白了执行器就是干活的人真正去存储引擎取数据职责根据执行计划调用存储引擎的接口获取数据对结果进行过滤、排序、聚合等处理-- 执行器的工作流程SELECT*FROMuserWHEREage18;-- 1. 调用存储引擎的索引接口获取满足条件的记录ID-- 2. 调用存储引擎的行读取接口获取完整行数据-- 3. 返回结果集给客户端实战案例场景一查看 SELECT 执行流程-- 开启性能监控SETprofiling1;-- 执行查询SELECT*FROMuserWHEREid1;-- 查看执行过程SHOWPROFILES;SHOWPROFILEFORQUERY1;输出示例-------------------------------- | Status | Duration | -------------------------------- | starting | 0.000045 | | checking permissions | 0.000006 | | Opening tables | 0.000015 | | init | 0.000008 | | System lock | 0.000006 | | optimizing | 0.000004 | | statistics | 0.000012 | | preparing | 0.000008 | | executing | 0.000003 | | Sending data | 0.000035 | | end | 0.000003 | | query end | 0.000002 | | closing tables | 0.000004 | | freeing items | 0.000015 | | cleaning up | 0.000003 | --------------------------------场景二优化器选错索引-- 创建测试表CREATETABLEorders(idINTPRIMARYKEYAUTO_INCREMENT,user_idINT,statusVARCHAR(20),amountDECIMAL(10,2),create_timeDATETIME,INDEXidx_user_id(user_id),INDEXidx_status(status),INDEXidx_create_time(create_time));-- 插入数据status 分布不均匀INSERTINTOorders(user_id,status,amount,create_time)SELECTFLOOR(RAND()*10000),CASEWHENRAND()0.9THENcompletedELSEpendingEND,ROUND(RAND()*1000,2),DATE_ADD(2026-01-01,INTERVALFLOOR(RAND()*365)DAY)FROM(WITHRECURSIVE cteAS(SELECT1ASnUNIONALLSELECTn1FROMcteWHEREn100000)SELECT*FROMcte)tmp;-- 查看执行计划EXPLAINSELECT*FROMordersWHEREstatuspendingANDcreate_time2026-06-01;-- 优化器可能选错索引强制指定SELECT*FROMordersFORCEINDEX(idx_create_time)WHEREstatuspendingANDcreate_time2026-06-01; AI 辅助实战AI 能不能帮我对比不同 SQL 写法的执行流程能让 AI 分析同一需求的不同写法对比执行流程和性能差异提示词示例 以下两种写法都能查询有订单的用户请分析执行流程有什么区别 写法1子查询 SELECT * FROM users WHERE id IN (SELECT user_id FROM orders) 写法2JOIN SELECT DISTINCT u.* FROM users u JOIN orders o ON u.id o.user_id 请分析 1. 两种写法的执行流程 2. 哪种写法性能更好 3. 什么场景下选择哪种写法AI 分析结果对比项写法1子查询写法2JOIN执行流程先执行子查询再用 IN 匹配先 JOIN再去重索引使用可能无法使用索引可以使用索引临时表可能需要临时表需要临时表去重性能数据量大时较慢通常更快AI 优化建议写法1 改成 EXISTS 或 JOIN写法2 可以用 GROUP BY 代替 DISTINCT都可以加索引优化避坑指南⚠️ 真实踩过的坑不要迷信 EXPLAINEXPLAIN 只是优化器的预估一般不会有太大偏差但它不是实际执行情况建议用EXPLAIN ANALYZEMySQL 8.0看真实执行长连接要定期重置长连接会导致内存增长临时表、排序缓冲区等建议定期调用mysql_reset_connection()重置会话状态C API 示例MYSQL*connmysql_init(NULL);mysql_real_connect(conn,localhost,root,,test,0,NULL,0);mysql_query(conn,SELECT * FROM user);// 重置连接不断开只清理会话状态mysql_reset_connection(conn);优化器统计信息要定期更新统计信息过期会导致优化器选错索引建议定期执行ANALYZE TABLE思考题 互动时间如果 SELECT 语句执行很慢你会按什么顺序排查为什么 MySQL 8.0 移除了查询缓存优化器选错了索引除了FORCE INDEX还有什么办法总结面试考点执行流程连接器 → 查询缓存 → 解析器 → 预处理器 → 优化器 → 执行器连接器权限验证、长连接/短连接查询缓存MySQL 8.0 已移除因为失效频繁、命中率低解析器词法分析、语法分析优化器基于统计信息选择最优执行计划执行器调用存储引擎获取数据下期预告WHERE子句优化技巧 —— 面试必问全本合集《每天一个MySQL知识点百日打怪升级》有问题欢迎评论区交流明天见

相关文章:

【MySQL百日打怪升级第8天】SELECT执行流程

【第8天】每天一个MySQL知识点,百日打怪升级 SQL基础:SELECT执行流程 大家好,我是一名拥有10年以上经验的DBA老兵。 做这个系列,源于一个朴素的愿望:把踩过的坑、总结的经验系统化输出,希望能帮到刚入行或…...

堆叠集成方法

原文:towardsdatascience.com/the-stacking-ensemble-method-984f5134463a 发现堆叠在机器学习中的力量——一种将多个模型组合成一个单一强大预测器的技术。本文从基础知识到高级技术探讨了堆叠,揭示了它是如何结合不同模型的优势以提高准确性的。无论你…...

离谱!上海交大一学生私吞 5000 奖金,还用豆包 P 假收据骗队友。网友:学历虽高但人品太低

①5 月 18 日,上海交大一则学生违纪通报冲上热搜,实锤了前几天网上曝光的一名学生侵占团队竞赛奖金、造假欺骗队友的恶劣行为。②在 2025 下半年,樊同学(上交大智慧能源学院女生)与 K 同学(电院男生&#x…...

ABAP 采购带组件收货BAPI

一、背景 有一项业务比较特殊,金靶的回收加工,既会有物料的消耗,也会收进上一批加工洗出来的物料,并且组件物料会带有批次,MIGO过账时需要填写批次,那么对应BAPI,也需要加入这一部分批次。如果…...

荣耀MagicOS 10系统游戏模式:如何启用幻影稳帧功能并调整游戏画面的流畅度与画质平衡?

用手机玩游戏,最怕遇到卡顿和画面不清晰。想开高帧率保证流畅,画质就可能下降;想开高画质享受视觉盛宴,又容易掉帧卡顿。这真是让不少玩家头疼的问题。如果你的荣耀手机升级到了MagicOS 10系统,那么恭喜你,…...

Perplexity不是越低越好!资深NLP架构师亲授:3类典型查询场景下的阈值黄金区间

更多请点击: https://kaifayun.com 第一章:Perplexity不是越低越好!资深NLP架构师亲授:3类典型查询场景下的阈值黄金区间 Perplexity(困惑度)常被误认为语言模型性能的“万能标尺”,但实际部署…...

一小时搞懂Python函数:原理+实践

目录 🙄什么是Python函数(了解函数的概念) 🤔为什么需要它?(背景和痛点) 😮函数的分类(函数有哪些?) 内置函数 标准库函数 第三方库函数 定…...

互联网大厂 Java 求职者面试:音视频场景下的技术挑战

互联网大厂 Java 求职者面试:音视频场景下的技术挑战在一次互联网大厂的面试中,面试官和候选人燕双非之间展开了一场精彩的对话。燕双非是一位幽默风趣的程序员,尽管他在技术上并不是特别扎实,但他总是能用他的幽默化解紧张氛围。…...

软件设计师下午题训练2-3题+2020下上午题错题解析 练习真题训练15

一、训练题2 1、2021上 (1) (2) a:团购点编号 b:客户电话 供货 主键 :(供货商编号,团购点编号) 外键:供货商编号、团购点编号 订单 主键:订单编号…...

PHP SimpleXML:深入解析与高效使用

PHP SimpleXML:深入解析与高效使用 引言 PHP 是一种广泛使用的服务器端脚本语言,它以其灵活性和强大的功能而闻名。在处理 XML 数据时,PHP 提供了多种方法,其中 SimpleXML 是一个简单且强大的库,它允许开发者轻松地解析和操作 XML 数据。本文将深入探讨 PHP SimpleXML 的…...

远洋边缘计算实战:基于 Linux 的客滚船高并发网络 QoS 调度与隔离策略

摘要:客滚船直连卫星网络面对几百名旅客并发时存在瘫痪与越权风险。本文记录了基于 Linux 构建标准工业级边缘网关多链路 QoS 调度与隔离的实操复盘。导语:在主导一艘国际客滚船的网络重构项目时,我们面临一个典型的高并发调度与合规挑战&…...

RAG检索体系①【第十一篇】:混合检索架构(BM25+向量+过滤),工业级召回落地方案

生产级 RAG 避坑实战合集【第十一篇】文章简介:前十篇我们彻底打通数据层改写层:文档清洗、Chunk切块、元数据、生命周期、Query双层改写。绝大多数人做完这些,直接无脑上单向量检索。线上投产全部翻车。本文直击行业痛点:纯向量检…...

c++11的初见

列表初始化 c11以后支持{ }的列表初始可以使用{ }括住数据来进行初始化&#xff0c;使用{ }初始化时可以省略号{ }中的数据要匹配构造&#xff1b;使用{ }可以统一初始化方式。#include<iostream> #include<vector> using namespace std; int main(){vector<pai…...

YOLO26优化:TIP2026 FourierSR | FourierSR引入YOLO C3k2:解决感受野局限,实现高效全局特征交互

💡💡💡现有 YOLO C3k2 模块主要基于卷积与跨阶段部分连接,虽能平衡计算与精度,但仍存在以下问题: 感受野受限:堆叠的小核卷积(如 33)感受野有限,难以捕获全局上下文,对尺度变化大或远距离依赖的目标(如小目标、遮挡目标)特征提取能力不足。 特征混合效率低:通…...

基于 HarmonyOS 6.0 的智能家政预约页面实战开发:从页面构建到跨端体验优化

基于 HarmonyOS 6.0 的智能家政预约页面实战开发&#xff1a;从页面构建到跨端体验优化 前言 随着 HarmonyOS 生态不断完善&#xff0c;HarmonyOS 6.0 已经不仅仅是一个移动端操作系统&#xff0c;而是逐渐演变为一个真正意义上的全场景分布式操作平台。对于开发者而言&#xf…...

基于 HarmonyOS 6.0 的家政服务预约页面实战开发:ArkUI 页面构建与跨端设计深度解析

基于 HarmonyOS 6.0 的家政服务预约页面实战开发&#xff1a;ArkUI 页面构建与跨端设计深度解析 前言 随着 HarmonyOS 生态逐渐成熟&#xff0c;HarmonyOS NEXT 与 HarmonyOS 6.0 的持续推进&#xff0c;越来越多开发者开始从传统 Android、Flutter、Web 技术栈逐步迁移到鸿蒙原…...

Ubuntu 下 P106-100 矿卡 `nvidia-smi No devices were found` 问题解决全过程

Ubuntu 下 P106-100 矿卡 nvidia-smi No devices were found 问题解决全过程 最近折腾一张老矿卡 P106-100,在 Ubuntu 下遇到一个非常经典的问题: nvidia-smi No devices were found但是: lspci | grep -i nvidia却能看到显卡: 01:00.0 3D controller: NVIDIA Corporat…...

《龙虾OpenClaw系列:从嵌入式裸机到芯片级系统深度实战60课》060、未来趋势与芯片设计者的思考

OpenClaw系列总结:未来趋势与芯片设计者的思考 昨晚调试一块RISC-V核的cache一致性,波形里看到一条store指令被莫名其妙地重复执行了两次。我盯着GTKWave看了半小时,最后发现是写缓冲的valid信号在复位释放后没有清零——一个典型的“芯片级”bug,在嵌入式裸机里永远不会遇…...

3分钟学会:免费飞书文档转Markdown终极指南

3分钟学会&#xff1a;免费飞书文档转Markdown终极指南 【免费下载链接】cloud-document-converter Convert Lark Doc to Markdown 项目地址: https://gitcode.com/gh_mirrors/cl/cloud-document-converter 想象一下&#xff0c;你花了好几个小时在飞书上精心排版的技术…...

桌面音乐可视化革命:Lano Visualizer如何让你的音乐“看得见“

桌面音乐可视化革命&#xff1a;Lano Visualizer如何让你的音乐"看得见" 【免费下载链接】Lano-Visualizer A simple but highly configurable visualizer with rounded bars. 项目地址: https://gitcode.com/gh_mirrors/la/Lano-Visualizer 在数字时代&#…...

5分钟终极指南:用m4s-converter永久保存你的B站缓存视频

5分钟终极指南&#xff1a;用m4s-converter永久保存你的B站缓存视频 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的烦恼…...

大模型微调实战:用LoRA技术微调LLaMA 2模型

在人工智能技术飞速发展的当下&#xff0c;大语言模型&#xff08;LLM&#xff09;在自然语言处理领域展现出了强大的能力。LLaMA 2作为Meta推出的开源大模型&#xff0c;凭借其出色的性能和广泛的适用性&#xff0c;成为了众多开发者和研究人员的首选。对于软件测试从业者而言…...

【RuoYi】数据分页功能分析 —— 以登录日志页面为例

本文基于 RuoYi-Vue v3.8.2&#xff0c;以"监控 → 登录日志"页面为例&#xff0c;从前端代码、前端开发者工具、后端代码到后端 Log 输出&#xff0c;完整分析 RuoYi 框架中数据分页的实现原理。一、实例简介本次分析选取的含数据分页功能的页面为&#xff1a;系统管…...

GIS技巧100例23-ArcGIS像元统计实战:从月度栅格到年度气候指标

1. 像元统计基础与气候数据特点 刚接触GIS处理气候数据时&#xff0c;我经常被各种栅格格式和统计方法搞得晕头转向。直到有次用ArcGIS的像元统计工具批量处理了5年的月降水数据&#xff0c;才发现这个功能简直是隐藏的效率神器。像元统计&#xff08;Cell Statistics&#xff…...

AI数据标注实战:如何高效、准确地标注训练数据

在AI模型的开发与迭代过程中&#xff0c;数据标注是连接原始数据与智能算法的关键桥梁&#xff0c;其质量与效率直接决定了模型的性能上限。对于软件测试从业者而言&#xff0c;掌握高效、准确的数据标注方法&#xff0c;不仅能为AI模型提供可靠的训练“食粮”&#xff0c;更能…...

【致91岁的双胞胎】堡垒复习:3步搭建理科“作战地图”,告别零散刷题效率翻倍

很多学生长期陷入理科复习瓶颈:花费大量时间刷题、背书,成绩却始终原地踏步。核心根源只有一个:照搬文科的复习方式学理科。 文科复习侧重知识点记忆、框架梳理、素材积累,通用的A4纸整理法完全适用;但理科的核心是逻辑闭环、体系串联、题型落地、抗遗忘复盘,死记硬背、…...

2026年选对工作钢格板厂家,这三大核心标准决定你的采购成败

在工业厂房、化工厂、电厂等生产场景中&#xff0c;工作钢格板作为至关重要的安全承重平台与通道&#xff0c;其产品质量直接关系到人员安全与生产稳定。2026年的制造业竞争愈发激烈&#xff0c;供应链选择也更为审慎。面对市场上琳琅满目的供应商&#xff0c;您是否正为找到一…...

《字节码到JVM:Java基础核心知识点全解析(小林八股·上)》

&#x1f525;个人主页&#xff1a;北极的代码&#xff08;欢迎来访&#xff09; &#x1f3ac;作者简介&#xff1a;java后端学习者 ❄️个人专栏&#xff1a;苍穹外卖日记&#xff0c;SSM框架深入&#xff0c;JavaWeb ✨命运的结局尽可永在&#xff0c;不屈的挑战却不可须臾或…...

2026年终极指南:JetBrains IDE试用期重置完整解决方案

2026年终极指南&#xff1a;JetBrains IDE试用期重置完整解决方案 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter JetBrains IDE试用期重置是每个开发者都可能遇到的挑战&#xff0c;当IntelliJ IDEA、PyCharm、W…...

实测 DeepSeek-V4 接入 Hermes:一句话爬取几十个网页,真的丝滑!

你好&#xff0c;我是郭震OpenClaw龙虾使用有一段时间了&#xff0c;体感很好&#xff0c;即便使用本地模型&#xff0c;如Qwen3.5:9B这样的模型&#xff0c;养虾Token自由&#xff0c;回复也比较丝滑。如下所示&#xff0c;轻松生成HTML风格的文件结构树&#xff1a;也能轻松生…...