PHP&;PDO:哪个更快?正在获取计数(*)或行计数()?
好的,我的问题是我有一个脚本,在每个页面上加载,它通过检查名为“禁止”的列来检查登录用户是否被禁止,该列可以输出0(未禁止)或1(禁止)。我尝试过搜索,但没有找到性能更好的绝对答案: 正在获取计数(*)查询: 使用rowCount()而不是获取:PHP&;PDO:哪个更快?正在获取计数(*)或行计数()?,php,mysql,mysqli,pdo,Php,Mysql,Mysqli,Pdo,好的,我的问题是我有一个脚本,在每个页面上加载,它通过检查名为“禁止”的列来检查登录用户是否被禁止,该列可以输出0(未禁止)或1(禁止)。我尝试过搜索,但没有找到性能更好的绝对答案: 正在获取计数(*)查询: 使用rowCount()而不是获取: $query = $PDO->prepare("SELECT banned FROM users WHERE id = :ID AND banned = 1"); $query->execute(array(":ID" => $USE
$query = $PDO->prepare("SELECT banned FROM users WHERE id = :ID AND banned = 1");
$query->execute(array(":ID" => $USER_ID));
if ($query->rowCount() > 0) {
// USER IS BANNED! SHOW ERROR MESSAGE!
}
我使用200k个随机生成的条目执行了一个基准测试,其中包含三列id、name和banked。3467名用户被随机选择禁止使用。我正在AWS micro实例上使用以下配置: PHP7.0.30-0 Ubuntu 0.16.04.1 MySQL 5.7.22-0 基准测试结果:
COUNT(*)执行耗时0.00022506713867188秒
rowcount()执行耗时0.00011420249938965秒
rowcount()
是赢家。我对随机生成的200k个条目执行了基准测试,其中包含三列id、名称和禁止。3467名用户被随机选择禁止使用。我正在AWS micro实例上使用以下配置:
PHP7.0.30-0
Ubuntu 0.16.04.1
MySQL 5.7.22-0
基准测试结果:
COUNT(*)执行耗时0.00022506713867188秒
rowcount()执行耗时0.00011420249938965秒
rowcount()
获胜
select COUNT(*)与select*不同
fetchColumn()和rowCount()都是由mysql执行的
(1) 如果mysql中的数据太多,会影响性能
(2) 另外,你可以认为它们是一样的,你可以同时使用它们
如果选择第一种方法,mysql会返回所有的数据结果,
它将使用数据转换、网络、时间等
所以你应该考虑一下你的真实环境来决定使用哪一个。
select COUNT(*)与select*不同
fetchColumn()和rowCount()都是由mysql执行的
(1) 如果mysql中的数据太多,会影响性能
(2) 另外,你可以认为它们是一样的,你可以同时使用它们
如果选择第一种方法,mysql会返回所有的数据结果,
它将使用数据转换、网络、时间等
所以你应该考虑一下你的真实环境来决定使用哪一个环境。回显开始时间和停止时间之间的时间差。多次执行此操作。可以添加限制1
,以限制第二个限制查找更多行。在第二种情况下,也可以选择1
。。。但我强烈怀疑我们谈论的是性能上的微小差异,除非你是Google/Facebook之类的人,否则就不值得费心了。问题的可能重复取决于使用的表引擎、使用的索引和表大小。。但是对于计数,选择COUNT(*)…
将是最有意义的,并且如果正在使用索引,将表现得最好测试它!回显开始时间和停止时间之间的时间差。多次执行此操作。可以添加限制1
,以限制第二个限制查找更多行。在第二种情况下,也可以选择1
。。。但我强烈怀疑我们谈论的是性能上的微小差异,除非你是Google/Facebook之类的人,否则就不值得费心了。问题的可能重复取决于使用的表引擎、使用的索引和表大小。。但是对于计数,选择COUNT(*)…
将最有意义,并且在使用索引的情况下性能最佳。您是否尝试了重复标记的代码?如果您已经进行了一些设置,则会很有趣。rowCount
不是一种可靠的方法来计算select获取的行数。select EXISTS
比rowCount()
或count(*)慢30%
您是否尝试过重复标记的代码?如果您已经进行了一些设置,则会很有趣。rowCount
不是一种可靠的方法来计算select获取的行数select EXISTS
比rowCount()
或count(*)慢30%
$query = $PDO->prepare("SELECT banned FROM users WHERE id = :ID AND banned = 1");
$query->execute(array(":ID" => $USER_ID));
if ($query->rowCount() > 0) {
// USER IS BANNED! SHOW ERROR MESSAGE!
}