Sql 为什么选择计数会获取很多行?
表团队包含1169行,其中1133行有UserId字段=0“UserId”字段上有一个索引 查询:Sql 为什么选择计数会获取很多行?,sql,indexing,Sql,Indexing,表团队包含1169行,其中1133行有UserId字段=0“UserId”字段上有一个索引 查询: EXPLAIN选择UserId!=0 返回要检查的行估计数等于1133的输出 为什么查询需要检查所有行?它不应该仅仅为此目的使用索引吗 谢谢。它将检查几乎所有的行,因为您需要几乎所有的行(因为您说的UserId!=0)。当然,然后进行“计数”,这样只显示一条记录,但为了计数,必须提取所有记录。 如果你想去哪里 select count(1) from teams where UserId = 10
EXPLAIN选择UserId!=0
返回要检查的行估计数等于1133的输出
为什么查询需要检查所有行?它不应该仅仅为此目的使用索引吗
谢谢。它将检查几乎所有的行,因为您需要几乎所有的行(因为您说的UserId!=0)。当然,然后进行“计数”,这样只显示一条记录,但为了计数,必须提取所有记录。 如果你想去哪里
select count(1) from teams where UserId = 100
然后它只检查几行,因为您要求的是一个精确的值(UserId=XX而不是UserId!=yy)。您是否尝试过选择计数(UserId)?您确定这不是索引项的计数吗?记住,对于聚集索引,表就是索引。但是为什么要使用used COUNT(1)?这与COUNT(*)有何不同?@Budda在早期使用*将获取整个行结构,然后对它们进行计数,因此使用COUNT(任何常量)可以避免这种情况。这可能不是当前DBMS的情况,但我养成了这个习惯。在任何情况下,我的响应中最重要的是“UserId=xx”,而不是“UserId!=xx”。我将编辑响应以澄清。@AlejoBrz:我不知道有哪个数据库管理系统在
count(*)
和count(1)
中起到了作用。这永远只是一个神话。@a_horse_可能没有名字,但它确实有意义!:-)