嵌入式开发实战:NXP PXD10 QuadSPI接口配置与驱动编写详解
2026/6/15 12:22:52
MySQL 的复杂查询(如多表 JOIN、子查询、窗口函数)会显著增加 CPU 开销——这不仅是经验之谈,更是由 MySQL 的查询执行模型和算法复杂度决定的。
📌若无索引:JOIN 变成O(n×m)的暴力匹配,CPU 线性爆炸。
相关子查询(Correlated Subquery):
SELECT*FROMusers uWHEREEXISTS(SELECT1FROMorders oWHEREo.user_id=u.id);users每行都执行一次子查询;非相关子查询(Uncorrelated):
SELECT*FROMusersWHEREidIN(SELECTuser_idFROMVIPs);ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary);PARTITION BY分组;ORDER BY排序;SUM(salary) OVER (ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)需动态滑动窗口);💡 窗口函数在 MySQL 8.0 引入,虽强大,但比 GROUP BY + JOIN 更耗 CPU,因其需保留原始行+计算派生列。
| 操作 | 理想复杂度(有索引) | 最坏复杂度(无索引) | CPU 敏感度 |
|---|---|---|---|
| 单表主键查询 | O(1) | O(n) | 低 |
| 简单 WHERE 过滤 | O(log n) | O(n) | 中 |
| 两表 JOIN(有索引) | O(n log m) | O(n×m) | 高 |
| 三表以上 JOIN | O(n log m log k) | O(n×m×k) | 极高 |
| 相关子查询 | O(n × log m) | O(n×m) | 极高 |
| 窗口函数(含排序) | O(n log n) | O(n log n) + 临时表 | 高 |
⚠️关键点:无索引时,复杂度呈乘积级增长,CPU 使用率急剧上升。
复杂查询常触发内部临时表(internal temporary table):
tmp_table_size/max_heap_table_size),转为磁盘临时表(MyISAM);🔍 通过
EXPLAIN查看:
Extra: Using temporary→ 需要临时表;Extra: Using filesort→ 需要排序;
两者同时出现,CPU 峰值几乎必然。
MySQL 优化器会尝试重写查询以降低 CPU 开销,例如:
IN (subquery)转为semijoin;EXISTS转为anti/semi join;WHERE t1.a = t2.b AND t2.c = 5→ 提前过滤t2)。但优化器也有局限:
✅因此,开发者必须主动优化:
索引设计 + 查询重写 + 执行计划分析,是降低 CPU 的三把利刃。
JOIN或EXISTS(MySQL 通常能优化EXISTS);-- 慢:相关子查询SELECT*FROMusers uWHERE(SELECTCOUNT(*)FROMorders oWHEREo.user_id=u.id)>0;-- 快:LEFT JOIN + IS NOT NULLSELECTDISTINCTu.*FROMusers uLEFTJOINorders oONu.id=o.user_idWHEREo.idISNOTNULL;GROUP BY而非ROW_NUMBER();performance_schemaevents_statements_current中的CPU_TIME(MySQL 8.0+);复杂查询的本质,是将“数据关联与计算”从应用层下沉到数据库层。
这提升了表达力和一致性,但也把计算负担转移给了 MySQL 的 CPU。
正如庖丁所言:“以无厚入有间,恢恢乎其于游刃必有余地矣”——
高手写 SQL,
不硬碰全表之骨,而游于索引之隙,
让复杂查询,亦如解牛般从容。
所以,你的判断完全正确:
MySQL 复杂查询,确实会显著增加 CPU 开销——
而理解其机理,正是优化之始。