Sql 为什么选择计数会获取很多行?

Sql 为什么选择计数会获取很多行?,sql,indexing,Sql,Indexing,表团队包含1169行,其中1133行有UserId字段=0“UserId”字段上有一个索引 查询: EXPLAIN选择UserId!=0 返回要检查的行估计数等于1133的输出 为什么查询需要检查所有行?它不应该仅仅为此目的使用索引吗 谢谢。它将检查几乎所有的行,因为您需要几乎所有的行(因为您说的UserId!=0)。当然,然后进行“计数”,这样只显示一条记录,但为了计数,必须提取所有记录。 如果你想去哪里 select count(1) from teams where UserId = 10

表团队包含1169行,其中1133行有UserId字段=0“UserId”字段上有一个索引

查询:

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_可能没有名字,但它确实有意义!:-)