代码之家  ›  专栏  ›  技术社区  ›  markus

在检查是否存在时,我应该在哪里进行行计数:SQL或PHP?

  •  1
  • markus  · 技术社区  · 16 年前

    在我想检查的情况下,如果数据库中存在某个条目,我有两个选项。

    我可以使用count()创建SQL查询,然后检查结果是否为>0…

    …或者我可以检索记录,然后计算返回行集中的行数。例如,$result->num_rows;

    什么更好/更快?在MySQL中?一般来说?

    8 回复  |  直到 16 年前
        1
  •  1
  •   Matt Rogish    16 年前
    SELECT 1 
      FROM (SELECT 1) t 
     WHERE EXISTS( SELECT * FROM foo WHERE id = 42 )
    

    刚刚测试过,在MySQLv5上运行良好

    计数(*)通常效率较低,如果:

    1. 你可以有副本(因为 DBMS必须彻底 搜索所有记录/索引 给你确切的答案)或者
    2. 有空条目(相同 原因)

    如果您基于保证生成单个记录(或0)的WHERE子句进行计数 DBMS知道这一点(基于唯一索引),那么它应该同样有效。但是,你不太可能总是有这种情况。另外,DBMS可能并不总是依赖于版本和DBMS来实现这一点。

    应用程序中的计数(当您不需要行时)几乎总是保证较慢/更糟,因为:

    1. 您必须向客户机发送数据,客户机必须对其进行缓冲并做一些工作。
    2. 您可能会在DBMS MRU/LRU数据缓存中发现更重要的内容。
    3. 您的DBMS(通常)需要做更多的磁盘I/O来获取您永远不会使用的记录数据。
    4. 你有更多的网络活动

    当然,如果您想对该行做一些事情(如果它存在),那么简单地尝试从中提取该行肯定会更快/最好!

        2
  •  2
  •   Matt McClellan    16 年前

    但是我怀疑,如果您只是在检查是否存在,并且不需要以任何方式使用检索到的数据,那么count()查询将更快。速度的快慢取决于数据的多少。

        3
  •  2
  •   rebra    16 年前

    最快的可能是询问数据库是否存在以下问题:

    SELECT EXISTS ([your query here])
    
        4
  •  1
  •   John MacIntyre    16 年前

    如果你所做的只是检查是否存在,那么

    Select count(*) ...
    

    但是,如果您将检索数据(如果存在),那么只需获取数据并在PHP中检查它,否则您将有两个调用。

        5
  •  1
  •   Luís Tedim    16 年前

    因为我在数据库里。

    计数(1)要比$result->num_行快,因为在$result->num_行中,您要进行2个操作1选择,如果select有一个计数,则要进行计数以获得结果。 除非您还需要来自数据库的信息。

        6
  •  0
  •   derobert    16 年前

    如果你想要原始速度,基准!除了其他人提出的方法外:

    SELECT 1 FROM table_name WHERE ... LIMIT 1
    

    由于避免了子选择,可能会更快。基准测试。

        7
  •  0
  •   Sabyasachi Mishra    9 年前
    SELECT COUNT(*) FROM table
    

    是最好的选择,这种操作在小桌子和大桌子上都非常快。尽管有可能

    SELECT id FROM table
    

    小桌子上的速度越快,速度的差别就越小。但是如果你有一张大桌子,这个操作会非常慢。

    因此,你最好的选择是 COUNT(*) the table (而且做起来更快 * 比选择一个特定的 column )总的来说,这将是最快的操作。

        8
  •  -1
  •   adam    16 年前

    我肯定会在PHP中这样做,以减少数据库的负载。

    为了数数 获取SQL中返回的行,您需要执行两个查询。一个计数,然后一个选择

    PHP方法为您提供了一个结果对象中所需的一切。