1
select count(*) 
from table 

执行时间比:

select count(*) 
from table 
where x = '1' 
here x is not an index

使用where子句,SQL 必须做一些额外的工作,所以为什么有 where 子句的查询很快。

4

2 回答 2

2

这通常是因为您有一个包含该列的索引x

一般来说,count(*)需要扫描所有行或扫描最小的索引(取决于数据库)。

相比之下,对于您的where子句,基本上有两种方法:

  • 扫描所有行并执行比较。
  • 在满足条件的索引中查找值。

第二种方法通常比第一种方法快得多。

其他因素可能会起作用。例如,另一个进程可能正在更新或插入行,这会将锁放在表或表的某些部分上。这可能会减慢其他查询。但是,原因很可能是索引的存在。

于 2018-12-16T12:10:57.313 回答
1

通过传递 WHERE 子句,您指示您的 RDBMS 只需要扫描表的一部分来查找结果。如果没有 WHERE 子句,则需要扫描所有表。这并不意味着一种解决方案总是比另一种更快。

一种解决方案是否比另一种更快实际上取决于多种因素,例如:

  • 表结构(例如,WHERE 子句中的列是否有索引),

  • 大小(行数)

  • 过滤列中的数据分布

  • 统计数据的准确性(最近为该表计算的统计数据,样本大小,......)

基于这些因素,您的 RDBMS 的优化器将决定应该使用哪个执行计划,这将最终决定查询性能。

于 2018-12-16T11:49:57.437 回答