可能是重复问题:
哪个更快/更好?SELECT * 还是 SELECT column1,column2,column3 等
不使用 select * 的原因是什么?
使用 SELECT * 而不是 SELECT FieldName,FieldName2 ... 是否存在性能问题?
可能是重复问题:
哪个更快/更好?SELECT * 还是 SELECT column1,column2,column3 等
不使用 select * 的原因是什么?
使用 SELECT * 而不是 SELECT FieldName,FieldName2 ... 是否存在性能问题?
SELECT C1,C2 FROM T WHERE C1=123
- 优化器具有所有索引信息,不需要访问表数据。
- 相反,如果你执行SELECT * FROM T WHERE C1=123
,优化器需要获取所有列的数据,然后不能使用(C1,C2)上的索引。唯一的性能问题是,如果您的应用程序只需要由select *
返回的字段子集。在数据库中,它们实际上是相同的东西,因此没有性能差异。
SELECT col1、col2、col3
和SELECT *
是相同的。 - Fenton每次使用 select * 时,可能需要额外查询列的列表。在高并发环境下,这可能会成为可见的开销,但偶尔使用一次不会有任何影响。
此外,在插入记录时,永远不要在插入语句中使用 select *,以防添加列。
我不了解计算性能,但在可读性/可维护性方面(即人的表现),我们在我的店里不使用select *。一切都是显式选择的。
SELECT *
存在可读性和可维护性问题。始终使用特定的字段名称是有意义的,即使您想选择所有字段也是如此。性能方面,不是很好。在一个表格中,比如有10列,连接了其他两个或更多的表格,特别是在结果集较大时,SELECT * 可以返回数十列数据,其中大部分甚至是未使用或无用的数据。从DBMS的负担来看,影响不大,但所有这些数据仍然需要以某种方式传输到网络上;网络带宽和延迟肯定会累加。我在高负载环境下亲眼见过这种情况。这绝对很重要。
除了带宽问题外,您还可能遇到模糊的列命名问题(消除歧义通常意味着从一开始就删除 SELECT *,所以最好从一开始就这样做),并且在代码内明确代码需求也被认为是良好的实践;这样做在许多方面都有帮助——调试、协作等。