首页/数据/SQL 速查/避免 SELECT *
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条变更与事务52 条
性能与执行计划72 条

避免 SELECT *

需要什么列就写什么列:减少 IO 与网络传输,保住覆盖索引机会,也让代码对表结构变更更稳健。

SQL 速查数据更新于 2026-10-12

示例

示例
-- 覆盖索引:只取索引中的列
EXPLAIN SELECT id, user_id, created_at
FROM orders
WHERE user_id = 100;
-- Extra: Using index

-- SELECT * 多出的列迫使回表
EXPLAIN SELECT * FROM orders WHERE user_id = 100;

-- 另一种常见坑:用 INSERT ... SELECT * 强绑结构
INSERT INTO orders_bak (SELECT * FROM orders);  -- 表加列即错位
IO少读不需要的列;大字段(TEXT/BLOB/宽 VARCHAR)收益明显
覆盖索引列清单越精确越容易被索引覆盖,避免回表
稳定性显式列清单对表加列不敏感,读取端不受影响

易错点

  • 在表的列结构会变化时使用 SELECT *:返回集合与代码假设不一致,序列化直接错位
  • 改列清单后忽略主键也可被覆盖:显式列出“主键 + 过滤列”常能免回表

数据来源与参考

  • MySQL 8.0 Reference Manual · Optimizing SELECT Statements
  • PostgreSQL Documentation §14.1 Using EXPLAIN
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌