我想了解sql count到底是如何工作的。发生的是整个表扫描,还是正在读取的表的某些属性。然而,我觉得在包含大量记录的大型表的情况下,表扫描将是一种开销。
发布于 2010-06-15 20:12:46
通常,要么执行表扫描,要么执行索引扫描。这主要是因为在支持MVCC的引擎中,不同的事务可以看到不同的行,因此不存在同时对每个人都正确的单个“行数”。
同样,如果您有一个WHERE子句,那么where条件对于不同的客户端可能是不同的,因此它们会看到不同的数字。
如果您需要对大型表进行大量计数,请考虑将您自己的计数器存储在不同的表中。具体如何做到这一点完全取决于应用程序。
发布于 2010-06-15 20:13:00
这将在很大程度上取决于您正在使用的SQL实现(MS SQL Server、MySQL、Oracle、PostgreSQL等),以及它的优化器有多聪明。
它也可能取决于查询。例如,使用类似于
SELECT COUNT(primary_key) FROM table;
优化器可能意识到不需要扫描表(因为没有使用WHERE
进行过滤,也不可能有任何值为NULL),只需返回表的大小即可。对于更复杂的查询(其中有过滤,或者可能出现NULL),数据库可能必须扫描表,或者它可以使用索引进行一些优化。
发布于 2010-06-15 20:14:24
这显然是依赖于实现的(即不同的关系数据库可能采用不同的策略)和使用依赖(即select count(*) from mytable
和select count(*) from mytable where myfield < somevalue
)可能使用不同的方法,即使在同一个DB中。
如果您正在尝试基于某个已由索引表示的分区来获取计数,则智能数据库将尝试单独使用索引。或者像Foxbase中使用的旧的"rushmore“。
因此,“这取决于”,但最终,如果没有更好的方法可用,是的,数据库将执行表扫描。
https://stackoverflow.com/questions/3044898
复制相似问题