【问题标题】:MySQL count rows performanceMySQL 计数行性能
【发布时间】:2010-12-23 17:41:00
【问题描述】:

对于InnoDB 存储,最好按记录总数计算

  • 使用mysql_num_rows on

    select * from tbl where pk = 1
    

或通过

  • 获取数组并从中检索“总”值

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

?

【问题讨论】:

    标签: mysql performance


    【解决方案1】:

    绝对是后者。它可以直接从 PK 的索引中获取值,而前者几乎可以肯定需要表扫描(除非 每一列 都是索引的一部分;即使这样,它也必须从各处获取值索引)。然后根据您连接到数据库的方式,有大量数据传输只是为了计数。

    explain 可以在这里提供帮助。在这种情况下,它会告诉您选择已被优化掉。

    【讨论】:

      【解决方案2】:

      除了Zxpro的回答,还有MySQL内部的努力:

      select * from tbl where pk = 1
      

      强制 MySQL 以物理方式检索匹配的行;而

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

      允许 MySQL 对主键中的条目进行计数,而不检索任何表行

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 在你调用mysql_fetch_array之前MySQL实际上并没有传输数据
        • 那么在这种情况下为什么不是第一个更好?
        • MySQL 仍然会以某种方式缓冲查询结果,直到数据被完全提取。
        【解决方案4】:

        如果“pk”是主键,则只能有一条记录,所以答案要么是0要么是1,所以你真的不需要计算它们。

        但是是的,后者。

        InnoDB 不仅需要检查索引,还需要检查行对当前事务是否可见,因为 MVCC。但这是一个细节。无论如何它都会使用覆盖索引(如果 pk 是主键,这无关紧要,因为它始终是聚集的)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-03
          • 2011-09-17
          • 2017-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多