性能影响
SELECT *
会返回表的所有字段,包括未被查询使用的字段。当表字段较多或包含大文本/BLOB类型时,会消耗更多网络带宽和内存资源。而明确列出字段可以只获取必要数据,减少数据传输量。
-- 明确字段的查询示例
SELECT id, name, email FROM users;
可维护性
SELECT 全部字段
的写法通常指手动列出所有字段名。这种写法在表结构变更时可能引发问题,新增字段不会被自动包含,删除字段会导致查询报错。而SELECT *
会自动适应表结构变化,但可能导致应用层意外接收到新字段。
索引利用率
明确列出字段名时,如果只查询索引覆盖的字段,数据库可能直接使用索引而无需回表。例如只查询被联合索引包含的字段时,性能更优。SELECT *
总会触发全列读取,无法利用这种优化。
-- 索引覆盖查询示例(假设有联合索引(name, age))
SELECT name, age FROM users WHERE name LIKE 'A%';
结果集稳定性
SELECT *
的结果顺序依赖于表定义时的字段顺序,不同数据库版本可能不同。明确列出字段可以固定结果集结构,对应用程序更友好。
代码可读性
明确的字段列表能清晰展示查询意图,方便其他开发者理解查询目标。SELECT *
需要额外查看表结构才能知道返回内容。
应用层耦合
使用SELECT *
会导致应用层代码与数据库物理结构强耦合。当表结构调整时,可能引发应用逻辑异常。明确字段列表可以降低这种耦合度。
视图与联合查询
在视图或多表联合查询中,SELECT *
可能返回重复列名或意外的大量字段。明确字段列表能精准控制输出结果。
-- 多表查询时推荐明确字段
SELECT u.id, u.name, o.order_date
FROM users u JOIN orders o ON u.id = o.user_id;