SQL在JOIN语句中过滤非必要字段_减少传输开销与查询执行时间

应只SELECT必要字段、WHERE条件勿误放ON中、用覆盖索引避免回表、小表驱动大表且驱动表需有索引。SELECT 中只写真正需要的字段,别用 *用 * 看起来省事,但数据库得把整行所有字段从磁盘读出来、经过网络传给客户端、再被应用层丢弃掉------这些字段哪怕你压根没用,也全程参与了 I/O、内存、网络开销。尤其当表里有 TEXT、JSON、BLOB 或宽字段(比如 50 列)时,性能下降会非常明显。实操建议:JOIN 前先列清楚业务逻辑真正要什么:是只需要 user.id 和 order.total?那就只 SELECT 这两个如果用 ORM,确认它生成的 SQL 没偷偷加 * 或冗余字段(比如 Django 的 .values() / .only() 要显式指定)对宽表 JOIN,宁可多写几遍字段名,也别依赖 SELECT * ------ 后续加字段时,* 会无声无息拖慢查询WHERE 条件写在 JOIN 后,别错放到 ON 里过滤主表ON 是定义关联逻辑的,WHERE 才是最终筛选结果的。把本该在 WHERE 的条件(比如 user.status = 'active')误塞进 ON,会导致 LEFT JOIN 变成隐式 INNER JOIN,或漏掉本该保留的左表记录------这不是字段多不多的问题,是逻辑错误。常见错误现象:LEFT JOIN users u ON u.id = o.user_id AND u.status = 'active' → 如果用户 status 不是 active,这条 user 记录就"消失"了,哪怕你只想查订单,也拿不到对应用户信息正确做法是:LEFT JOIN users u ON u.id = o.user_id WHERE u.status = 'active'(注意:这会让 LEFT JOIN 失效,等价于 INNER;若真要保留左表空值,WHERE 应写成 WHERE (u.status = 'active' OR u.status IS NULL))用覆盖索引避免回表,让 SELECT 字段全落在索引里如果 SELECT 的字段都能被某个索引"覆盖",MySQL/PostgreSQL 就不用回主键索引捞数据------直接从二级索引里读完走人。这对 JOIN 尤其关键:每多一次回表,就是多一次随机 I/O。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。

相关推荐
Jo乔戈里4 分钟前
免费本地搜图软件
图像处理·python·搜索引擎·ai
for_ever_love__11 分钟前
字符串处理——f-string、切片与正则,清洗文本的第一把刀
python·大模型·虚拟环境
夜晚回家18 分钟前
Python 零基础入门 | 输入的数字为什么不能直接算
开发语言·python
打工仔折腾 AI29 分钟前
把AI Agent托管在家用电脑:UU远程终端与端口映射实测记录
人工智能·后端·python·langchain·ai agent 实战
yivifu40 分钟前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub
零基础12344 分钟前
Agent 的 Memory 怎么做科研:以中医诊断场景为例
人工智能·经验分享·python·语言模型
databook1 小时前
面向数据工程师的正则表达式:从日志清洗到字段提取
python·正则表达式·数据分析
ss2732 小时前
AI全栈实战 | 3.2-01 Python 基础:四大数据容器怎么选,推导式为什么是 Pythonic 的灵魂
开发语言·人工智能·python
计算机毕业编程指导师2 小时前
【大数据毕设选题推荐】基于Spark的WTA职业网球赛事演变与竞技格局分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·python·计算机·spark·毕业设计·课程设计·wta网球
言乐62 小时前
Python区分广度优先深度优先宽度优先的区别
python·算法·深度优先·广度优先·宽度优先