为什么要避免 SELECT *

避免 SELECT * 是数据库开发中的一条重要原则,主要基于以下几个核心原因:


1. 性能浪费

  • 不必要的 I/O :读取不需要的列会增加磁盘 I/O,尤其当表包含大字段(如 TEXTBLOB、长字符串)时,代价巨大。
  • 内存与 CPU 开销:数据库需要将多余的数据加载到内存,并进行解析、传输,消耗更多 CPU 和内存资源。

2. 网络传输负担

  • 在客户端与数据库分离的场景(如应用程序服务器 + 数据库服务器),SELECT * 会传输大量无用数据,增加网络延迟,尤其在云环境或跨机房部署时影响显著。

3. 索引无法有效覆盖

  • 如果只需要少数几个字段,可以创建覆盖索引 ,直接通过索引返回数据(Using index),避免回表查询。
    使用 SELECT * 会强制回表,即使查询条件用到了索引,性能也会大打折扣。

4. 可读性与维护性差

  • 表结构变化引发隐患 :当表增加新列,SELECT * 会无差别返回所有列。如果应用代码未正确处理新增列(例如按位置取列值),可能导致程序异常或数据错乱。
  • 意图不清晰:阅读代码的人不知道实际需要哪些字段,增加维护难度。

5. 连接操作(JOIN)时的膨胀

  • 多表 JOIN 时使用 SELECT * 会返回所有参与表的全部列,极易产生重复列名(如 idname),并导致结果集行数不变但列数爆炸,浪费大量内存和网络资源。

✅ 正确做法

  • 只选择需要的列SELECT col1, col2 FROM table
  • 明确列名 :即使在 INSERT ... SELECT 或临时调试时也尽量列出字段
  • 利用工具/框架:ORM(如 MyBatis、Hibernate)中只映射必要字段

📌 唯一例外(可接受使用 SELECT *

  • 极低频率的临时查询 (手动 SELECT * 看一眼数据样本)
  • 已知表只有少数几列且未来不会变化(如配置表、字典表)
  • 使用 EXISTS 子查询时SELECT * 会被优化器忽略,写 SELECT 1 更规范)

💬 面试回答模板

"避免 SELECT * 主要是为了性能、网络和可维护性。它会额外读取不需要的列,增加磁盘 I/O 和网络传输;无法利用覆盖索引,容易导致回表;同时表结构变更时可能引发未知错误。最佳实践是始终显式列出所需字段。"

相关推荐
山峰哥3 小时前
SQL优化从入门到精通:20个案例破解性能密码
数据库·sql·oracle·性能优化·深度优先
努力努力再努力wz3 小时前
【MySQL进阶系列】拒绝冗余SQL:带你透彻理解视图的底层逻辑
android·c语言·数据结构·数据库·c++·sql·mysql
历程里程碑3 小时前
MySQL数据类型全解析 + 代码实操讲解
大数据·开发语言·数据库·sql·mysql·elasticsearch·搜索引擎
Python大数据分析@4 小时前
有哪些好用又免费的SQL工具?
数据库·sql
HackTwoHub14 小时前
AI大模型网关存在SQL注入、附 POC 复现、影响版本LiteLLM 1.81.16~1.83.7(CVE-2026-42208)
数据库·人工智能·sql·网络安全·系统安全·网络攻击模型·安全架构
l1t14 小时前
DeepSeek总结的DuckLake构建基于 SQL 原生表格式的下一代数据湖仓
数据库·sql
yaodong51817 小时前
不会Python也能数据分析:Gemini 3.1 Pro解决办公问题的SQL自动生成
python·sql·数据分析
苍煜19 小时前
慢SQL优化实战教学
java·数据库·sql
雪碧聊技术1 天前
组合查询(union)
数据库·sql
juniperhan1 天前
Flink 系列第24篇:Flink SQL 集成维度表指南:存储选型、参数调优与实战避坑
大数据·数据仓库·sql·flink