2011-03-04 52 views
0

可能重复:
Can select * usage ever be justified?从foo中选择*有什么含义?

好奇,从更多的DBA洞察人听到这一点,但什么性能影响确实从当你看到这样一个查询的应用面:

select * from some_large_table;

您必须执行全表扫描,因为没有索引是b我相信如果我们在谈论O符号,我们在这里说O(N),其中N是表的大小。这通常被认为不是最佳行为?如果你确实需要在特定时间从桌面上的所有东西呢?是的,我们有诸如分页等工具,但我在这里严格从数据库的角度来谈论。这种行为通常会被忽略吗?

+0

通常,当涉及数据库时,大O符号指的是磁盘IO的数量,而不是算术运算 –

+1

除了性能影响外,我绝不会推荐使用'select * from ...'。为什么?您的查询不是未来证明。想象一下,你今天有4列。您期望从您的查询中获得4列。现在想象未来的某一天,一列将被添加或删除,或者甚至两列在该表中被交换。所有地狱都可能破裂。因此,最好在你的'选择'中明确说明你需要的所有列。没有更多,不少。 – darioo

+0

@Armen Tsirunyan:可以讨论的观点。精心设计和调整的服务器将始终将索引保留在内存中。因此,即使没有执行磁盘IO,从B树索引中获取某些东西仍然会花费O(logN)。 – zerkms

回答

1

如果您不指定列,会发生什么情况?数据库引擎是否必须查询列列表的主表数据。该查询速度非常快,但会导致性能问题。只要你没有用JOIN语句或嵌套查询做一个马虎SELECT *,你应该没问题。但是,请注意让数据库引擎执行查询来查找列的性能影响很小。

+0

“如果不指定列,会发生什么情况,因为数据库引擎必须查询列表列表的主表数据。” - - 所以呢?当你拿起整个桌子时,它不是一个瓶颈。我甚至没有提到表格元信息几乎总是被缓存在内存中。 – zerkms

0

MySQL服务器在服务器端打开游标以读取该表。查询的客户端可能不会读取任何或所有记录,并且客户端的性能仅取决于它实际获取的记录数。此外,服务器端查询的性能可能比查询时快一些,因为它也涉及一些索引读取。只有客户端获取所有记录时,它才相当于全表扫描。

0
  1. 选择比您需要的更多的列(select *)始终是不好的。不要做比你更多的事情
  2. 如果你从整个表格中进行选择,你是否有索引并不重要。

你将要遇到的一些其他问题是你想如何锁定表格。如果这是一个繁忙的应用程序,您可能不想完全防止锁定,因为可能会返回不一致的数据。但是,如果你锁得太紧,可能会进一步减慢查询速度。 O(n)在任何计算机科学应用程序中都被认为是可接受的。然而,在数据库中,我们测量的时间为&读取/写入次数。这是大量的读取操作,可能需要很长时间才能执行。所以这是不可接受的。

相关问题