我同意几乎所有的答案,除了某些性能声明。如果您实际上要使用表中的所有列,我认为 SELECT * 版本要快一点。原因如下:
在 (id,x) 上有唯一索引的表上执行这两个查询:
SELECT x,y,z,w FROM tab WHERE id='abc' ORDER BY s
SELECT x,y,z,w FROM tab WHERE id='abc'
AND x in ('a','b','c','d','e','f','g','h',...)
ORDER BY ('a','b','c','d','e','f','g','h',...)
哪个更快?如果 'x in' 子句将表中 x 的所有值命名为 id 'abc',那么第一个查询可能会更快。现在让我们重命名这些字段:
SELECT field_name, field_type, field_offset, field_len
FROM internal_field_catalog
WHERE table_name = 'abc'
ORDER BY field_order
因此,在检索数据时,SELECT * 允许引擎执行(相当于)单个 memcpy 以将行数据移动到结果集中,并且在检索字段数据时,它可能会更快地被选中。
我要说的是有一个极端情况,SELECT * 非常有用并且可能更快。您可能总是需要表中的所有列的一个原因是在 RDBMS 中存储对象持久性时(出于某种原因)。每个经验法则都有一个例外。