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)还有其他最好的方法吗?

4

5 回答 5

4

首先,使用 COUNT(*) 而不是 COUNT(fieldname),因为 mysql 针对 COUNT(*) 进行了优化。

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

于 2013-05-22T10:36:12.130 回答
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

}
于 2013-05-22T10:36:06.957 回答
0

试试这个,

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

对于总行数,使用

$resultTotal=mysql_query("SELECT FOUND_ROWS()");

阅读此http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

还有哪个最快?SELECT SQL_CALC_FOUND_ROWS FROM `table`,或 SELECT COUNT(*)

于 2013-05-22T10:36:53.450 回答
0

您可以自己检查以这种方式发布的两个代码:

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

我认为一次使用第二次会是经济的,但如果你必须迭代这些值,那么准备好的声明会更好。

于 2013-05-22T10:45:23.783 回答
0

显然,第二个更好。在第一次查询时,Mysql尽量考虑一些系统资源来获取和保持id列作为结果集$result,特别是在大量数据中,这将是获得更多时间执行查询的重要原因。但是在第二个查询中,它只是分配了一个计数器变量,例如cnt用于显示计数记录。

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

于 2013-05-22T11:14:30.950 回答