在我想检查的情况下,如果数据库中的某个条目存在,我有两个选择。
我可以使用 COUNT() 创建一个 sql 查询,然后检查结果是否> 0 ...
...或者我可以只检索记录,然后计算返回的行集中的行数。例如 $result->num_rows;
什么更好/更快?在 mysql 中?一般来说?
YMMV,但我怀疑如果您只是检查是否存在,并且不需要以任何方式使用检索到的数据,那么 COUNT() 查询会更快。速度快多少取决于数据量。
最快的可能是询问数据库是否存在:
SELECT EXISTS ([your query here])
如果您所做的只是检查是否存在,那么
Select count(*) ...
但是,如果您要检索数据(如果存在),那么只需获取数据并在 PHP 中检查它,否则您将有两个调用。
对我来说是在数据库中。
进行 count(1) 比 $result->num_rows 更快,因为在 $result->num_rows 中,您进行 2 次操作 1 选择,如果选择有计数则进行计数更快地获得结果。除非您还想从数据库中获取信息。
SELECT 1
FROM (SELECT 1) t
WHERE EXISTS( SELECT * FROM foo WHERE id = 42 )
刚刚测试,在 MySQL v5 上运行良好
COUNT(*) 通常在以下情况下效率较低:
如果您基于保证生成单个记录(或 0)的 WHERE 子句进行计数,并且DBMS 知道这一点(基于 UNIQUE 索引),那么它应该同样有效。但是,您不太可能总是有这种情况。此外,取决于版本和 DBMS,DBMS 可能并不总是能够接受这一点。
在应用程序中计数(当您不需要该行时)几乎总是保证会更慢/更差,因为:
当然,如果你想对存在的行做一些事情,那么简单地尝试获取开始的行肯定更快/最好!
SELECT COUNT(*) FROM table
是最好的选择,这个操作在小表和大表上都非常快。虽然有可能
SELECT id FROM table
在小桌子上更快,速度差异将是微观的。但是如果你有一个大表,这个操作可能会很慢。
因此,您最好的选择是始终选择COUNT(*) the table
(这样做*
比选择特定的要快column
),总体而言,这将是最快的操作。
如果您想要原始速度,请进行基准测试!除了其他人建议的方法:
SELECT 1 FROM table_name WHERE ... LIMIT 1
由于避免了子选择,可能会更快。对其进行基准测试。
我肯定会在 PHP 中这样做以减少数据库的负载。
为了获得计数并在 SQL 中获取返回的行,您必须执行两个查询。一个 COUNT,然后是一个 SELECT
PHP 方式在一个结果对象中为您提供所需的一切。