1

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

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

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

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

4

8 回答 8

2

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

于 2008-12-03T15:49:20.917 回答
2

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

SELECT EXISTS ([your query here])
于 2008-12-03T15:49:34.533 回答
1

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

Select count(*) ...

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

于 2008-12-03T16:03:29.390 回答
1

对我来说是在数据库中。

进行 count(1) 比 $result->num_rows 更快,因为在 $result->num_rows 中,您进行 2 次操作 1 选择,如果选择有计数则进行计数更快地获得结果。除非您还想从数据库中获取信息。

于 2008-12-03T16:07:03.783 回答
1
SELECT 1 
  FROM (SELECT 1) t 
 WHERE EXISTS( SELECT * FROM foo WHERE id = 42 )

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

COUNT(*) 通常在以下情况下效率较低:

  1. 您可以有重复项(因为 DBMS 必须彻底搜索所有记录/索引才能给您准确的答案)或
  2. 有 NULL 条目(出于同样的原因)

如果您基于保证生成单个记录(或 0)的 WHERE 子句进行计数,并且DBMS 知道这一点(基于 UNIQUE 索引),那么它应该同样有效。但是,您不太可能总是有这种情况。此外,取决于版本和 DBMS,DBMS 可能并不总是能够接受这一点。

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

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

当然,如果你想对存在的行做一些事情,那么简单地尝试获取开始的行肯定更快/最好!

于 2008-12-03T16:11:14.523 回答
0
SELECT COUNT(*) FROM table

是最好的选择,这个操作在小表和大表上都非常快。虽然有可能

SELECT id FROM table

在小桌子上更快,速度差异将是微观的。但是如果你有一个大表,这个操作可能会很慢。

因此,您最好的选择是始终选择COUNT(*) the table(这样做*比选择特定的要快column),总体而言,这将是最快的操作。

于 2008-12-03T15:59:16.560 回答
0

如果您想要原始速度,请进行基准测试!除了其他人建议的方法:

SELECT 1 FROM table_name WHERE ... LIMIT 1

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

于 2008-12-03T16:55:29.330 回答
-1

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

为了获得计数在 SQL 中获取返回的行,您必须执行两个查询。一个 COUNT,然后是一个 SELECT

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

于 2008-12-03T15:50:55.670 回答