在 SQL 查询中直接使用 SELECT * 看似方便,但实际上会引入多种潜在问题。以下是主要原因及实际场景分析:
SELECT * 会返回表中所有字段,包括不需要的列(如大字段 TEXT/BLOB)。-- 假设表 `users` 包含 `id, name, bio (TEXT), avatar (BLOB)`
SELECT * FROM users WHERE id = 1; -- 返回所有列(包含大字段)
SELECT id, name FROM users WHERE id = 1; -- 仅返回必要字段网络开销:大字段会显著增加数据传输量,尤其在分布式系统中。
内存占用:应用层处理冗余数据会消耗更多内存。
-- 索引 `idx_name` 仅包含 `name`
SELECT * FROM users WHERE name = 'Alice'; -- 需回表查主键索引获取其他列
SELECT name FROM users WHERE name = 'Alice'; -- 直接使用覆盖索引,无需回表SELECT * 可能导致应用层解析错误。
id, name,新增 email 后,应用若按固定顺序解析字段可能出错。id)会覆盖,需显式指定别名。-- 错误示例:两表的 `id` 列会冲突
SELECT * FROM users JOIN orders ON users.id = orders.user_id;
-- 正确做法:显式指定所需字段
SELECT users.id AS user_id, users.name, orders.order_date
FROM users JOIN orders ON users.id = orders.user_id;-- 模糊的查询
SELECT * FROM products WHERE price > 100;
-- 清晰的查询
SELECT product_id, product_name, price FROM products WHERE price > 100;password、token),SELECT * 会无意中暴露这些数据。SELECT *,后续表结构变更可能导致视图未更新,引发逻辑错误。SELECT * 扩散。
SELECT * 虽然省事,但会带来性能损耗、维护隐患和安全风险。显式指定字段不仅能优化查询效率,还能提升代码健壮性,是数据库开发中的重要规范
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。