为什么要避免 SELECT *

张开发
2026/4/12 22:05:33 15 分钟阅读

分享文章

为什么要避免 SELECT *
避免SELECT *是数据库开发中的一条重要原则主要基于以下几个核心原因1.性能浪费不必要的 I/O读取不需要的列会增加磁盘 I/O尤其当表包含大字段如TEXT、BLOB、长字符串时代价巨大。内存与 CPU 开销数据库需要将多余的数据加载到内存并进行解析、传输消耗更多 CPU 和内存资源。2.网络传输负担在客户端与数据库分离的场景如应用程序服务器 数据库服务器SELECT *会传输大量无用数据增加网络延迟尤其在云环境或跨机房部署时影响显著。3.索引无法有效覆盖如果只需要少数几个字段可以创建覆盖索引直接通过索引返回数据Using index避免回表查询。使用SELECT *会强制回表即使查询条件用到了索引性能也会大打折扣。4.可读性与维护性差表结构变化引发隐患当表增加新列SELECT *会无差别返回所有列。如果应用代码未正确处理新增列例如按位置取列值可能导致程序异常或数据错乱。意图不清晰阅读代码的人不知道实际需要哪些字段增加维护难度。5.连接操作JOIN时的膨胀多表 JOIN 时使用SELECT *会返回所有参与表的全部列极易产生重复列名如id、name并导致结果集行数不变但列数爆炸浪费大量内存和网络资源。✅ 正确做法只选择需要的列SELECT col1, col2 FROM table明确列名即使在INSERT ... SELECT或临时调试时也尽量列出字段利用工具/框架ORM如 MyBatis、Hibernate中只映射必要字段 唯一例外可接受使用SELECT *极低频率的临时查询手动SELECT *看一眼数据样本已知表只有少数几列且未来不会变化如配置表、字典表使用EXISTS子查询时SELECT *会被优化器忽略写SELECT 1更规范 面试回答模板“避免SELECT *主要是为了性能、网络和可维护性。它会额外读取不需要的列增加磁盘 I/O 和网络传输无法利用覆盖索引容易导致回表同时表结构变更时可能引发未知错误。最佳实践是始终显式列出所需字段。”

更多文章