【问题标题】:Should you always do a COUNT(*) before a SELECT * to determine if there are any rows?您是否应该始终在 SELECT * 之前执行 COUNT(*) 以确定是否有任何行?
【发布时间】:2012-09-19 18:19:54
【问题描述】:

在 MySQL 中,通常最好先执行 COUNT(*) 以确定是否应该执行 SELECT * 来实际获取行,还是直接执行 SELECT * 然后检查是否更好如果它返回任何行?

【问题讨论】:

  • 这取决于你的目标是什么......
  • 如果您以后要进行选择,那么进行计数(*)是无用的练习。

标签: mysql performance select count row


【解决方案1】:

除非您锁定有问题的表,否则执行select count(*) 是没有用的。考虑:

流程一:

SELECT COUNT(*) FROM T;

流程2:

INSERT INTO T

流程一:

...now doing something based on the obsolete count retrieved before...

当然,在服务器环境中锁定表并不是一个好主意。

【讨论】:

  • +1。这是唯一提到读取通常在片刻后过时的值的答案。
  • 如果引擎允许,事务应该足够了,不一定要锁定。
  • @Michael Krelin 假设当且仅当表为空时我需要插入一行。如果我使用select count(*),我需要阻止所有插入(顺便说一句,在这种情况下以及大多数其他情况下,最好的选择是在第二条语句的 WHERE 子句中添加一些 EXISTS 过滤器,然后使用受影响的行输出来了解如果操作成功)。
  • 嗯,这个逻辑需要以这种或另一种方式锁定,我指的是您的数据只是为了将来检索而过时的情况(我们谈论的是在选择之前先进行选择计数,记住?)。
  • @Michael Krelin - 黑客除非你设置SERIALIZABLE 隔离级别(这对性能/程序逻辑有影响,所以你不能只是“设置参数”),你不会得到一致的读取两个连续的SELECT 甚至在同一个事务中。
【解决方案2】:

这取决于您是否需要该号码,但特别是在mysql 中有一个calc_found_rows,IIRC。查找文档。

【讨论】:

  • 除非你是LIMIT查询,否则不需要。 num_rows() 工作正常。
  • @ceejayoz,是的,我假设了分页或类似的情况。
【解决方案3】:

SELECT [field1, field2 | *] FROM.... The SELECT COUNT(*) 总是会使您的代码膨胀,增加额外的传输和数据开销,并且通常无法维护。

【讨论】:

    【解决方案4】:

    表格是2个查询,后者是1个查询。每个查询都需要与数据库服务器对话。算一下。

    【讨论】:

      【解决方案5】:

      答案与许多此类问题一样 - “视情况而定”。当您在表上没有索引时,您不应该执行这两个查询。一般来说,只执行 COUNT 会浪费 IO 时间,所以如果这个操作可以帮助您在大多数情况下节省花费在 IO 上的时间,那么它可能是一个选择。

      【讨论】:

        【解决方案6】:

        在某些情况下,某些数据库驱动程序实现可能不会为返回记录本身的 select 语句返回实际选择的行数。当您需要在选择实际数据之前知道结果记录集的精确大小时,预先发出的 'count(*)' 很有用。

        【讨论】:

          猜你喜欢
          • 2010-09-24
          • 2017-02-11
          • 1970-01-01
          • 2011-11-03
          • 2019-01-08
          • 2020-05-05
          • 2022-01-23
          • 2013-08-09
          • 1970-01-01
          相关资源
          最近更新 更多