簡體   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