在MySQL + PHP中计算记录的最佳实践

3

我希望检查记录数是否大于15。

如何加速查询的最佳实践是什么?

1)

$query="SELECT `id` FROM `table` WHERE `name`='$name' AND `usage` > '$limit'";
$result=mysql_query($query);       
if(mysql_num_rows($result) >15) 
{
    //do task

}

2)

$query="SELECT COUNT(1) AS 'cnt' FROM `table` WHERE `name`='$name' AND `usage` > '$limit'";

$result=mysql_query($query); 
$row = mysql_fetch_assoc($result);

if($row['cnt'] >15) 
{
    //do task

}

3) 还有其他更好的方法吗?


2
第二个一直走。 - raina77ow
2
MySQLmysql_*函数)扩展已弃用。我建议使用 MySQLimysqli_*函数)或 PDO 代替。 - BlitZ
#3. SQL_CALC_FOUND_ROWS - iLaYa ツ
当您查看 EXPLAIN 计划并进行测试时,哪个更快/更有效率? - symcbean
可能是重复的问题:使用PHP计算行数的MySQL最佳实践。另一个有趣的资源在这里:从表格中计数,但在达到某个数字时停止计数 - RandomSeed
5个回答

5

首先,使用COUNT(*)代替COUNT(fieldname),因为mysql会优化COUNT(*)的执行。

其次,如果表非常大,请确保在WHERE子句中的列上建立索引以加快查询执行速度。


谢谢您的回复。我只检查记录数是否大于15。因此,我认为在查询中放置LIMIT 16是最好的选择。 - user2409005

0

你可以使用

$query="SELECT COUNT(id) as cnt FROM `table` WHERE `name`='$name' AND `usage` > '$limit'";

$result=mysql_query($query); 
$row = mysql_fetch_assoc($result);

if($row['cnt'] >15) 
{
    //do task

}

0

0

你可以按照这种方式自行检查你发布的两个代码:

$mt=microtime(true);
/* your code */
$qt=microtime(true)-$mt;
print "time elapsed: " . number_format($et) . "s\n";

我认为单次使用第二个选项会更经济,但如果您需要迭代值,则准备好的语句会更好。


0

显然,第二种方法更好。在第一次查询时,Mysql 会尝试考虑一些系统资源来获取并保留 id 列作为结果集,例如 $result,特别是在大量数据的情况下,这将是执行查询所需时间更长的一个重要原因。 但是在第二次查询中,它只分配一个计数器变量,例如 cnt,用于显示计数记录。

另外请注意,COUNT(id) 不会计算 NULL 值。因此,如果根据定义,id 可以设置为 NULL,最好使用 COUNT(*) 或者根据您的选择来计算 NULL 值或不计算。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接