繁体   English   中英

在PHP中执行多个MySQL查询的更有效方法

[英]More efficient way to perform multiple MySQL queries in PHP

我有一个在线商店,有数千个订单,并且我正在写一些查询查询每个供应商(品牌)在网站上赚了多少钱。 我有以下查询,所选年份的每个月查询一次:

$filterJan = "$filterYear-01";
$queryJan = "SELECT price, quantity FROM order_items WHERE productID='$productID' AND timestamp LIKE '%$filterJan%' LIMIT 10000";
$suppliersQueryFilter = mysql_query($queryJan, $connection) or die(mysql_error());

while($rowF = mysql_fetch_assoc($suppliersQueryFilter)) {
    $price = $rowF["price"]*$rowF["quantity"];
    $totalJan = $totalJan+$price;
}

**每月依此类推**

加载需要花费很多时间(至少要说60秒以上),而且我知道它在任何形状或形式上都不有效。 这些查询每个月都会搜索成千上万条记录。 有没有更有效的方法或将其编写为:

a)将代码量减少到大约1个查询b)使其更有效地增加加载时间

$ filterYear包含一年,例如2009。

因此,此查询的作用是选择选定年份(分配给$ filterYear)每个月赚多少钱。 因此,它生成的结果是一张表,其中包含1月,2月,3月...每个月赚了多少钱,所以2345英镑,2101英镑等。

您应该将时间戳存储为实际的mysql datetime值,这将使

GROUP BY YEAR(timestamp), MONTH(timestamp)
WHERE timestamp BETWEEN $initialtime AND $finaltime

可能的。 这样可以将多个基本相同的重复查询减少为一个查询。

您可以为此使用派生值,但效率不如使用本机datetime字段:

GROUP BY SUBSTR(timestamp, 0, 4), SUBSTR(timestamp, 6,2)

为了获得最佳性能,您想要向数据库提交类似这样的查询:

SELECT DATE_FORMAT(i.timestamp,'%Y-%m') AS `month`
     , SUM(i.price*i.qty)               AS `total`
  FROM order_items i 
 WHERE i.productID  = 'foo'
   AND i.timestamp >= '2013-01-01'
   AND i.timestamp <  '2013-01-01' + INTERVAL 12 MONTH
 GROUP
    BY DATE_FORMAT(i.timestamp,'%Y-%m')

(这假设timestamp列是MySQL数据类型TIMESTAMPDATETIMEDATE

使用不推荐使用的mysql_接口,您想使用mysql_real_escape_string函数避免SQL注入漏洞。 (更好的选择是使用mysqli或PDO接口,并使用带有绑定占位符的预处理语句。)

我们希望时间戳上的谓词在BARE列中,因此MySQL可以为范围扫描操作使用可用的合适索引,而不需要对表中的每一行进行全面扫描。

我们还希望利用服务器的功能来快速得出总计,并仅返回总计,而不是检索每个翻转行,并分别处理这些行中的每一个(RBAR =通过折行来排行)

GROUP BY子句和SUM()聚合函数是为适应此结果而量身定制的。

使用mysql_接口,查询将如下所示:

$querytext = "
SELECT DATE_FORMAT(i.timestamp,'%Y-%m') AS `month`
     , SUM(i.price*i.qty)               AS `total`
  FROM order_items i 
 WHERE i.productID  = '" . mysql_real_escape_string($thisProductID) . "'
   AND i.timestamp >= '" . mysql_real_escape_string($filterYear) . "-01-01'
   AND i.timestamp <  '" . mysql_real_escape_string($filterYear) . "-01-01' + 
                      INTERVAL 12 MONTH
 GROUP BY DATE_FORMAT(i.timestamp,'%Y-%m')";

# for debugging
#echo $querytext;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM