【发布时间】:2010-12-23 17:41:00
【问题描述】:
对于InnoDB 存储,最好按记录总数计算
-
使用
mysql_num_rowsonselect * from tbl where pk = 1
或通过
-
获取数组并从中检索“总”值
select count(*) as total from tbl where pk = 1
?
【问题讨论】:
标签: mysql performance
对于InnoDB 存储,最好按记录总数计算
使用mysql_num_rows on
select * from tbl where pk = 1
或通过
获取数组并从中检索“总”值
select count(*) as total from tbl where pk = 1
?
【问题讨论】:
标签: mysql performance
绝对是后者。它可以直接从 PK 的索引中获取值,而前者几乎可以肯定需要表扫描(除非 每一列 都是索引的一部分;即使这样,它也必须从各处获取值索引)。然后根据您连接到数据库的方式,有大量数据传输只是为了计数。
explain 可以在这里提供帮助。在这种情况下,它会告诉您选择已被优化掉。
【讨论】:
除了Zxpro的回答,还有MySQL内部的努力:
select * from tbl where pk = 1
强制 MySQL 以物理方式检索匹配的行;而
select count(*) as total from tbl where pk = 1
允许 MySQL 对主键中的条目进行计数,而不检索任何表行
【讨论】:
后者最有可能表现更好,因为您只传输一个整数,而在第一种情况下,您将发送更多数据。
【讨论】:
mysql_fetch_array之前MySQL实际上并没有传输数据
如果“pk”是主键,则只能有一条记录,所以答案要么是0要么是1,所以你真的不需要计算它们。
但是是的,后者。
InnoDB 不仅需要检查索引,还需要检查行对当前事务是否可见,因为 MVCC。但这是一个细节。无论如何它都会使用覆盖索引(如果 pk 是主键,这无关紧要,因为它始终是聚集的)
【讨论】: