1. 面试复盘WHERE与HAVING的本质区别在数据库查询中WHERE和HAVING这两个子句经常让初学者感到困惑。作为MySQL核心面试考点理解它们的差异需要从执行机制层面入手。1.1 执行阶段的根本差异WHERE子句在数据分组前进行过滤它作用于原始数据行。当执行包含WHERE的查询时数据库引擎会先扫描表数据根据WHERE条件筛选出符合条件的行然后再对这些行进行分组操作。-- WHERE在GROUP BY之前执行 SELECT department, AVG(salary) FROM employees WHERE hire_date 2020-01-01 -- 先筛选入职日期符合条件的记录 GROUP BY department;而HAVING子句在数据分组后进行过滤它作用于分组结果集。这意味着HAVING可以访问聚合函数的结果-- HAVING在GROUP BY之后执行 SELECT department, AVG(salary) as avg_salary FROM employees GROUP BY department HAVING avg_salary 10000; -- 对分组后的平均薪资进行筛选1.2 使用聚合函数的权限WHERE子句不能直接使用聚合函数如COUNT、SUM、AVG等因为此时尚未进行分组计算。如果需要基于聚合结果过滤必须使用HAVING-- 错误示例WHERE中使用聚合函数 SELECT department, COUNT(*) FROM employees WHERE COUNT(*) 5 -- 这里会报错 GROUP BY department; -- 正确写法 SELECT department, COUNT(*) as emp_count FROM employees GROUP BY department HAVING emp_count 5;1.3 性能影响对比WHERE在早期阶段过滤数据通常能显著减少需要处理的数据量。例如一个包含100万条记录的表如果WHERE条件能过滤掉90%的数据后续GROUP BY只需要处理10万条记录。而HAVING是在完成所有分组计算后才应用过滤条件如果过早使用HAVING而放弃WHERE过滤可能导致不必要的计算开销-- 低效写法 SELECT product_id, SUM(quantity) FROM order_details GROUP BY product_id HAVING product_id IN (1,2,3); -- 先对所有数据分组再过滤 -- 优化写法 SELECT product_id, SUM(quantity) FROM order_details WHERE product_id IN (1,2,3) -- 先过滤减少数据量 GROUP BY product_id;经验法则尽可能在WHERE中完成基础过滤HAVING仅用于必须基于分组结果的过滤。2. MySQL索引机制深度解析2.1 索引的底层数据结构MySQL最常用的InnoDB引擎采用B树作为索引结构。与普通B树不同B树具有以下特点非叶子节点仅存储键值不存储实际数据使得单个节点能容纳更多键值叶子节点形成有序链表支持高效的范围查询所有数据都存储在叶子节点查询路径长度一致(图示B树的三层结构高度为3时可支持约2000万条记录)2.2 聚簇索引与二级索引聚簇索引Clustered Index的特点是叶子节点存储完整数据行每张表只能有一个聚簇索引InnoDB默认使用主键作为聚簇索引-- 创建带有主键的表会自动建立聚簇索引 CREATE TABLE users ( id INT PRIMARY KEY, -- 聚簇索引键 name VARCHAR(50), email VARCHAR(100) );二级索引Secondary Index的特点叶子节点存储主键值而非完整数据查询需要回表操作通过主键二次查找可创建多个二级索引-- 添加二级索引 ALTER TABLE users ADD INDEX idx_name (name);2.3 索引选择与优化原则最左前缀原则复合索引(a,b,c)只能用于WHERE a?WHERE a? AND b?WHERE a? AND b? AND c?但无法用于WHERE b? 或 WHERE c?覆盖索引优化当索引包含所有查询字段时可避免回表-- 创建覆盖索引 ALTER TABLE orders ADD INDEX idx_cover (customer_id, order_date, amount); -- 以下查询可以直接使用索引数据 SELECT customer_id, order_date, amount FROM orders WHERE customer_id 1005;索引选择性原则选择区分度高的列建索引。计算选择性SELECT COUNT(DISTINCT status)/COUNT(*) AS selectivity FROM orders; -- 结果越接近1选择性越好2.4 索引失效的常见场景隐式类型转换字段定义为VARCHAR但用数字查询-- phone是varchar类型时 SELECT * FROM users WHERE phone 13800138000; -- 失效 SELECT * FROM users WHERE phone 13800138000; -- 有效使用函数操作SELECT * FROM logs WHERE DATE(create_time) 2023-01-01; -- 失效 SELECT * FROM logs WHERE create_time BETWEEN 2023-01-01 AND 2023-01-02; -- 有效LIKE通配符前置SELECT * FROM products WHERE name LIKE %手机%; -- 全表扫描 SELECT * FROM products WHERE name LIKE 苹果%; -- 可能使用索引OR条件不当使用-- 当name有索引而age无索引时 SELECT * FROM users WHERE name 张三 OR age 30; -- 全表扫描3. 高级索引应用场景3.1 索引下推优化(ICP)MySQL 5.6引入的Index Condition Pushdown优化允许在存储引擎层提前过滤数据-- 表结构 CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(50), age INT, dept VARCHAR(20), INDEX idx_name_dept (name, dept) ); -- 没有ICP时执行流程 -- 1. 通过name LIKE 张%定位索引范围 -- 2. 回表读取完整记录 -- 3. 在server层检查dept销售部 -- 启用ICP后执行流程 -- 1. 通过name LIKE 张%定位索引范围 -- 2. 在存储引擎层直接检查dept销售部 -- 3. 只对符合条件的记录回表 SET optimizer_switch index_condition_pushdownon; EXPLAIN SELECT * FROM employees WHERE name LIKE 张% AND dept 销售部;3.2 多范围读取优化(MRR)当执行范围查询时传统方式是按主键顺序多次随机I/O。MRR优化先收集键值再排序转为顺序I/O-- 启用MRR SET optimizer_switch mrron,mrr_cost_basedoff; EXPLAIN SELECT * FROM salaries WHERE emp_no BETWEEN 10010 AND 20000 ORDER BY salary DESC;3.3 索引合并优化当WHERE条件包含多个独立索引时MySQL可能使用Index Merge策略-- 表有index(a)和index(b) EXPLAIN SELECT * FROM table1 WHERE a 1 OR b 2; -- 可能使用索引合并策略4. 实战问题排查与优化4.1 慢查询分析流程确认慢查询日志已开启SHOW VARIABLES LIKE slow_query_log%; SET GLOBAL slow_query_log ON;使用EXPLAIN分析执行计划EXPLAIN FORMATJSON SELECT * FROM orders WHERE user_id 100 ORDER BY create_time DESC;关键指标解读type列从优到差 system const eq_ref ref range index ALLExtra列Using filesort需要额外排序Using temporary使用临时表Using index覆盖索引4.2 常见性能问题解决方案问题1分页查询变慢-- 低效写法偏移量大时 SELECT * FROM logs ORDER BY id LIMIT 100000, 20; -- 优化方案1使用索引覆盖延迟关联 SELECT t.* FROM logs t JOIN (SELECT id FROM logs ORDER BY id LIMIT 100000, 20) tmp ON t.id tmp.id; -- 优化方案2记录上次查询的最大ID SELECT * FROM logs WHERE id 100000 ORDER BY id LIMIT 20;问题2大表添加索引-- 在线DDL工具(pt-online-schema-change) pt-online-schema-change --alter ADD INDEX idx_email (email) Ddatabase,tusers -- MySQL 8.0原生在线DDL ALTER TABLE users ADD INDEX idx_email (email), ALGORITHMINPLACE, LOCKNONE;问题3索引统计信息不准确-- 手动更新统计信息 ANALYZE TABLE orders; -- 查看索引基数 SHOW INDEX FROM orders;4.3 监控与维护建议定期检查未使用索引SELECT * FROM sys.schema_unused_indexes;监控索引使用情况-- 开启性能schema UPDATE performance_schema.setup_instruments SET ENABLED YES WHERE NAME LIKE statement/%; -- 查询索引使用统计 SELECT * FROM sys.schema_index_statistics;维护建议避免过度索引每个额外索引会增加写操作开销对于VARCHAR长字段考虑前缀索引ALTER TABLE articles ADD INDEX idx_title (title(20));定期使用OPTIMIZE TABLE重整表空间针对MyISAM
企业数字化 ERP 产品动态
相关推荐
INS_EKF组合导航源码拆解:从编译到调参的工程实践 简介:这份资源是面向导航算法学习者与工程实践者的INS与EKF组合导航MATLAB代码包,聚焦惯性导航系统与扩展卡尔曼滤波的融合实现,适合具备一定导航原理基础、希望动手复现滤波流程的中高级读者。压缩包共19个文件,约21KB࿰… · 2026/11/3 16:32:35
2026区块链技术革新与五大黄金应用赛道 1. 2026区块链:技术革新的三大核心方向 区块链技术正在经历从2.0智能合约到3.0产业应用的跨越式发展。到2026年,我们预计将看到三个关键领域的技术突破:
1.1 共识机制的效率革命 工作量证明(PoW)和权益证明ÿ… · 2026/11/3 17:05:28
网络安全行业现状、薪资与转型路径解析 1. 网络安全行业现状与薪资水平解析 2023年网络安全人才市场呈现出明显的供需失衡状态。根据最新行业调研数据显示,我国网络安全人才缺口已达327万,而每年高校相关专业毕业生仅3万余人。这种结构性缺口直接反映在薪资水平上: 初级安全工程师… · 2026/11/9 3:07:42
普通电工证怎么考试,真实经历告诉你怎么避免白交培训费 普通电工证怎么考试,真实经历告诉你怎么避免白交培训费 怕考不过白交培训费?这是很多想考普通电工证的人心里最怕的事。其实很多人在报名之前就担心,培训费花了,考试又没过,那就亏大了。今天我就结合自己和身边人的 真实经历 ,给大家讲讲… · 2026/11/9 13:50:40
伊宁报考电工证上岗必备的转证难题怎么破?这些细节必须知道 伊宁报考电工证上岗必备的转证难题怎么破?这些细节必须知道 之前考的证在外省能不能转过来?这是不少准备报考或已经持有电工证的朋友最关心的问题之一,特别是那些在外地工作多年、想回老家发展的朋友。伊宁报考电工证,不仅关系到能否顺利上岗,还直接决定… · 2026/11/9 13:50:40
普通电工证怎么考试千万别踩坑,工地太忙也能拿证 普通电工证怎么考试千万别踩坑,工地太忙也能拿证 工地太忙根本没时间复习考试,这是很多一线电工的痛点。特别是像你这样刚毕业的河南工程类学生,手里攥着一堆证书,却因为流程不清楚、报名材料不全,最终错失了考试机会,甚至被“坑”了钱。… · 2026/11/9 13:50:40
工地太忙根本没时间复习考试?电工证共有几本的良心建议来了 工地太忙根本没时间复习考试?电工证共有几本的良心建议来了 工地太忙根本没时间复习考试?你不是一个人。很多人在工地上忙得脚不沾地,连吃饭都顾不上,更别说抽时间复习电工证考试了。但别以为这事儿能拖, 电工证共有几本… · 2026/11/9 13:50:40
电工证报考要户口本全流程办理指南,内部消息全公开 电工证报考要户口本全流程办理指南,内部消息全公开 你是不是正愁不知道去哪报名?怕被中介坑?别慌,今天我来给你讲明白, 电工证报考要户口本 的整个流程,还有那些不为人知的 内部消息 ,帮你避开弯路,省心省力拿证。… · 2026/11/9 13:50:40
初级电工证自学视频,工地太忙根本没时间复习考试,良心建议在这里 初级电工证自学视频,工地太忙根本没时间复习考试,良心建议在这里 工地太忙根本没时间复习考试,这是很多一线作业人员的真实写照。尤其是在施工项目紧锣密鼓推进的阶段,工友们往往连吃饭的时间都挤不出来,更别说抽出时间去备考特种作业证了。这种情况下,… · 2026/11/9 13:49:39
电工证丢失还能补吗?千万别踩坑,丢了证等于失业 电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/9 2:05:04
电力电缆作业证直播报名入口与办理流程良心建议 电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/9 3:11:26
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/9 5:24:17
电工证不需要考复审延期怎么办理 通过率揭秘 电工证不需要考复审延期怎么办理 通过率揭秘 不知道去哪报名怕被中介坑?电工证不需要考复审延期怎么办理?最近不少学员都在问这个问题,尤其是刚拿到证的新手,对复审流程一知半解,生怕被培训机构套路。别担心,今天咱们就来聊聊电工证复审的真相,尤其是… · 2026/11/9 0:00:54
砀山哪里考电工证的多 电工证报考别踩坑 郑州报考避坑指南 砀山哪里考电工证的多 电工证报考别踩坑 郑州报考避坑指南 工地太忙根本没时间复习考试,这几乎是所有一线施工人员的共同心声。尤其是像电工这样的特种作业,操作证不仅关系到能不能上工,还直接关系到工资高低和职业发展。可偏偏,很多人连怎么报名、去哪… · 2026/11/9 0:00:54
南方电网电工作业含金量高吗?应届生怎么考怎么干? 南方电网电工作业含金量高吗?应届生怎么考怎么干? 工地太忙根本没时间复习考试,这不是个别现象,而是很多刚毕业的工程类学生面临的现实。南方电网电工作业的证书,听起来门槛不低,但 含金量… · 2026/11/9 0:00:54
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:23:35
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:23:58
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:25:08