select count(*)
from table
执行时间比:
select count(*)
from table
where x = '1'
here x is not an index
使用where
子句,SQL 必须做一些额外的工作,所以为什么有 where 子句的查询很快。
select count(*)
from table
执行时间比:
select count(*)
from table
where x = '1'
here x is not an index
使用where
子句,SQL 必须做一些额外的工作,所以为什么有 where 子句的查询很快。
这通常是因为您有一个包含该列的索引x
。
一般来说,count(*)
需要扫描所有行或扫描最小的索引(取决于数据库)。
相比之下,对于您的where
子句,基本上有两种方法:
第二种方法通常比第一种方法快得多。
其他因素可能会起作用。例如,另一个进程可能正在更新或插入行,这会将锁放在表或表的某些部分上。这可能会减慢其他查询。但是,原因很可能是索引的存在。
通过传递 WHERE 子句,您指示您的 RDBMS 只需要扫描表的一部分来查找结果。如果没有 WHERE 子句,则需要扫描所有表。这并不意味着一种解决方案总是比另一种更快。
一种解决方案是否比另一种更快实际上取决于多种因素,例如:
表结构(例如,WHERE 子句中的列是否有索引),
大小(行数)
过滤列中的数据分布
统计数据的准确性(最近为该表计算的统计数据,样本大小,......)
基于这些因素,您的 RDBMS 的优化器将决定应该使用哪个执行计划,这将最终决定查询性能。