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

在PHP中执行多个MySQL查询的更有效方法,php,mysql,sql,performance,Php,Mysql,Sql,Performance,我有一家网上商店,有数千份订单,我正在写一些查询,以了解每个供应商(品牌)在网站上赚了多少钱。我有以下查询,所选年份的每个月都有一个查询: $filterJan = "$filterYear-01"; $queryJan = "SELECT price, quantity FROM order_items WHERE productID='$productID' AND timestamp LIKE '%$filterJan%' LIMIT 10000"; $suppliersQueryFilt

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

$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)每个月的收入。所以它生成的结果是一个包含一月、二月、三月。。。每个月赚了多少钱,比如2345英镑、2101英镑等等。

你应该将时间戳存储为一个实际的mysql日期时间值,这会使

GROUP BY YEAR(timestamp), MONTH(timestamp)
WHERE timestamp BETWEEN $initialtime AND $finaltime
微不足道的可能。这会将多个基本相同的重复查询减少为一个查询

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

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

您应该将时间戳存储为实际的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)

您应该将时间戳存储为实际的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)

您应该将时间戳存储为实际的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')

为了获得最佳性能,您需要向数据库提交类似以下内容的查询:

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')

为了获得最佳性能,您需要向数据库提交类似以下内容的查询:

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')

为了获得最佳性能,您需要向数据库提交类似以下内容的查询:

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')


对使用一个查询代替。一个查询通常比12个查询更有效,特别是对于那些可怕的结果循环,以获得每个月的总价格(使用SQL的SUM()聚合函数);但是你看过order_items表上的索引了吗?@草莓如何将其转换为1个查询?(我不是最好的)并对时间戳列使用其他筛选器<代码>如“%anything%”无法通过索引得到帮助。你可以用一个简单的。。。和或类似的。在年/月使用GROUP BY子句。使用一个查询代替。一个查询通常比12个查询更有效,特别是对于那些可怕的结果循环,以获得每个月的总价格(使用SQL的SUM()聚合函数);但是你看过order_items表上的索引了吗?@草莓如何将其转换为1个查询?(我不是最好的)并对时间戳列使用其他筛选器<代码>如“%anything%”无法通过索引得到帮助。你可以用一个简单的。。。和或类似的。在年/月使用GROUP BY子句。使用一个查询代替。一个查询通常比12个查询更有效,特别是对于那些可怕的结果循环,以获得每个月的总价格(使用SQL的SUM()聚合函数);但是你看过order_items表上的索引了吗?@草莓如何将其转换为1个查询?(我不是最好的)并对时间戳列使用其他筛选器<代码>如“%anything%”无法通过索引得到帮助。你可以用一个简单的。。。和或类似的。在年/月使用GROUP BY子句。使用一个查询代替。一个查询通常比12个查询更有效,特别是对于那些可怕的结果循环,以获得每个月的总价格(使用SQL的SUM()聚合函数);但是你看过order_items表上的索引了吗?@草莓如何将其转换为1个查询?(我不是最好的)并对时间戳列使用其他筛选器<代码>如“%anything%”无法通过索引得到帮助。你可以用一个简单的。。。和或类似的。在年/月+1中使用GROUP BY子句这是正确的方法。OP还希望包括
年(时间戳)
月(时间戳)
,并使用
总和(价格*数量)
合计。(OP代码似乎只是在添加价格,而忽略了数量,这似乎不正确。)也不清楚OP查询中为什么会有
限制10000
;OP真的只对每个月的前10000行感兴趣吗?这似乎也不对。这是正确的方法。OP还希望包括
年(时间戳)
月(时间戳)
,并使用
总和(价格*数量)
合计。(OP代码似乎只是在添加价格,而忽略了数量,这似乎不正确。)也不清楚OP查询中为什么会有
限制10000
;OP真的只对每个月的前10000行感兴趣吗?这似乎也不对。这是正确的方法。OP还希望包括
年(时间戳)
月(时间戳)
,并使用
总和(价格*数量)
合计。(OP代码似乎只是在增加价格,而忽略了数量,这似乎是不对的。)也不是