在检查是否存在时,我应该在哪里进行行计数:sql还是php?

在检查是否存在时,我应该在哪里进行行计数:sql还是php?,sql,count,Sql,Count,在我想检查的情况下,如果数据库中存在某个条目,我有两个选项 我可以使用COUNT()创建一个sql查询,然后检查结果是否大于0 …或者我可以检索记录,然后计算返回行集中的行数。例如,使用$result->num_行 什么更好/更快?在mysql中?一般来说?YMMV,但我怀疑如果您只检查存在性,而不需要以任何方式使用检索到的数据,COUNT()查询将更快。速度的快慢取决于数据量。YMMV,但我怀疑如果您只检查是否存在,而不需要以任何方式使用检索到的数据,COUNT()查询会更快。速度的快慢取决于

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

我可以使用COUNT()创建一个sql查询,然后检查结果是否大于0

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


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

YMMV,但我怀疑如果您只检查存在性,而不需要以任何方式使用检索到的数据,COUNT()查询将更快。速度的快慢取决于数据量。

YMMV,但我怀疑如果您只检查是否存在,而不需要以任何方式使用检索到的数据,COUNT()查询会更快。速度的快慢取决于数据量。

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

SELECT EXISTS ([your query here])

最快的可能是询问数据库是否存在某些内容:

SELECT EXISTS ([your query here])

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

为了获得计数和SQL中返回的行,您必须执行两个查询。。先计数,然后选择


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

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

SELECT COUNT(*) FROM table
为了获得计数和SQL中返回的行,您必须执行两个查询。。先计数,然后选择

PHP方式在一个结果对象中提供了所需的一切

SELECT COUNT(*) FROM table
是最佳选择,无论是在小表还是在大表上,此操作都非常快。虽然有可能

SELECT id FROM table
如果在小桌子上速度更快,速度上的差异将是微小的。但是如果您有一个大的表,这个操作可能会非常慢

因此,您最好的选择是始终选择对表进行
计数(*)
(而且做
*
比选择特定的
列要快),因为总体而言,这将是最快的操作

是最佳选择,无论是在小表还是在大表上,此操作都非常快。虽然有可能

SELECT id FROM table
如果在小桌子上速度更快,速度上的差异将是微小的。但是如果您有一个大的表,这个操作可能会非常慢


因此,您最好的选择是始终选择对表进行计数(
)(与选择特定的
列相比,
*
更快),总体而言,这将是最快的操作。

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

Select count(*) ...

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

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

Select count(*) ...

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

For me在数据库中

计数(1)比$result->num_行快,因为在$result->num_行中,您执行了两个操作:1 select和计数,如果select有计数,则更快获得结果。
除非您还需要数据库中的信息。

我的信息在数据库中

SELECT 1 
  FROM (SELECT 1) t 
 WHERE EXISTS( SELECT * FROM foo WHERE id = 42 )
计数(1)比$result->num_行快,因为在$result->num_行中,您执行了两个操作:1 select和计数,如果select有计数,则更快获得结果。 除非您还需要数据库中的信息

SELECT 1 
  FROM (SELECT 1) t 
 WHERE EXISTS( SELECT * FROM foo WHERE id = 42 )
刚刚测试过,在MySQL v5上运行良好

在以下情况下,计数(*)通常效率较低:

  • 您可以有重复项(因为 数据库管理系统将不得不穷尽一切 将所有记录/索引搜索到 给你确切的答案)或
  • 具有空条目(对于相同的 (理由)
  • 如果您是基于WHERE子句进行计数的,该子句保证生成单个记录(或0),并且DBMS知道这一点(基于唯一索引),那么它应该同样有效。但是,你不可能总是有这种情况。此外,DBMS可能并不总是会注意到这一点,这取决于版本和DBMS

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

  • 您必须向客户机发送数据,客户机必须对其进行缓冲并执行一些工作
  • 您可能会在DBMS MRU/LRU数据缓存中删除更重要的内容
  • 您的DBMS(通常)必须进行更多的磁盘I/O来获取您永远不会使用的记录数据
  • 你有更多的网络活动
  • 当然,如果您想对存在的行执行某些操作,那么首先尝试获取该行肯定会更快/最好

    刚刚测试过,在MySQL v5上运行良好

    在以下情况下,计数(*)通常效率较低:

  • 您可以有重复项(因为 数据库管理系统将不得不穷尽一切 将所有记录/索引搜索到 给你确切的答案)或
  • 具有空条目(对于相同的 (理由)
  • 如果您是基于WHERE子句进行计数的,该子句保证生成单个记录(或0),并且DBMS知道这一点(基于唯一索引),那么它应该同样有效。但是,你不可能总是有这种情况。此外,DBMS可能并不总是会注意到这一点,这取决于版本和DBMS

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

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

  • 当然,如果您想对存在的行执行某些操作,那么首先尝试获取该行肯定会更快/最好

    如果你想要原始速度,基准测试!我