【发布时间】:2011-03-04 14:28:25
【问题描述】:
很想从具有更多 DBA 洞察力的人那里听到这一点,但是当您看到如下查询时,应用程序会面临哪些性能影响:
select * from some_large_table;
您必须进行全表扫描,因为没有命中索引,我相信如果我们说的是 O 表示法,我们在这里说的是 O(N),其中 N 是表的大小。这通常被认为不是最佳行为吗?如果您确实在某些时候确实需要桌子上的所有东西怎么办?是的,我们有分页等工具,但我在这里严格从数据库的角度来讨论。这种行为通常是不被接受的吗?
【问题讨论】:
-
通常,当涉及到数据库时,大 O 表示法是指磁盘 IO 的数量,而不是算术运算
-
抛开性能影响不谈,我绝不推荐使用
select * from ...。为什么?您的查询不是未来的证明。假设您今天有 4 列。您期望查询中有 4 列。现在想象在未来的某一天,一列被添加或删除,甚至两列在该表中被交换。所有的地狱都可能破裂。因此,最好在您的selects中明确说明您需要的所有列。不多也不少。 -
@Armen Tsirunyan:可讨论的观点。精心设计和调优的服务器将始终将索引保存在内存中。因此,即使没有执行磁盘 IO,从 B-Tree 索引中获取内容仍然需要 O(logN)。
-
@zerkms:确实可以讨论,这就是我写“通常”的原因:)
-
@darioo:列交换。所以?使用名称而不是位置指向列。