MySQL计算行数的性能

10

对于使用 InnoDB 存储引擎的情况,计算记录总数更好的方法是:

  • 在表中使用 SELECT COUNT(*)

    select * from tbl where pk = 1
    

或者通过获取数组并从中检索出“total”值

select count(*) as total from tbl where pk = 1

?

4个回答

13
绝对是后者。它可以直接从主键索引获取值,而前者几乎肯定需要进行表扫描(除非每个列都是索引的一部分;即使如此,它也必须从所有索引中获取值)。然后根据您连接到数据库的方式,仅为了获取计数就会有大量数据传输。 explain 可以帮助这里。在这种情况下,它会告诉你选择已被优化掉了。

4
除了Zxpro的回答,MySQL内部也在努力:
select * from tbl where pk = 1

强制 MySQL 物理地检索匹配的行;而

select count(*) as total from tbl where pk = 1 

允许MySQL计算主键的条目数,而无需检索任何表行。


1

后者可能表现更好,因为您只传输一个整数,而在第一种情况下,您将发送更多的数据。


1
在调用mysql_fetch_array之前,MySQL实际上不会传输数据。 - Andomar
那么在这种情况下,为什么第一个不是更好的选择呢? - Wolfgang
MySQL仍然会以某种方式缓冲查询结果,直到全部数据被获取完毕。 - Bryan Menard

1
如果“pk”是主键,那么只能有一条记录,因此答案将是0或1,所以您实际上不需要计算它们。
但是,确实是后者。
InnoDB不仅需要检查索引,还需要检查行是否对当前事务可见,因为MVCC。但这只是一个细节。它将使用覆盖索引(如果pk是主键,则无关紧要,因为它始终是聚集的)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接