在检查是否存在时,我应该在哪里进行行计数:sql还是php?
在我想检查的情况下,如果数据库中存在某个条目,我有两个选项 我可以使用COUNT()创建一个sql查询,然后检查结果是否大于0 …或者我可以检索记录,然后计算返回行集中的行数。例如,使用$result->num_行在检查是否存在时,我应该在哪里进行行计数:sql还是php?,sql,count,Sql,Count,在我想检查的情况下,如果数据库中存在某个条目,我有两个选项 我可以使用COUNT()创建一个sql查询,然后检查结果是否大于0 …或者我可以检索记录,然后计算返回行集中的行数。例如,使用$result->num_行 什么更好/更快?在mysql中?一般来说?YMMV,但我怀疑如果您只检查存在性,而不需要以任何方式使用检索到的数据,COUNT()查询将更快。速度的快慢取决于数据量。YMMV,但我怀疑如果您只检查是否存在,而不需要以任何方式使用检索到的数据,COUNT()查询会更快。速度的快慢取决于
什么更好/更快?在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来获取您永远不会使用的记录数据
你有更多的网络活动
当然,如果您想对存在的行执行某些操作,那么首先尝试获取该行肯定会更快/最好 如果你想要原始速度,基准测试!我