【发布时间】:2016-01-01 23:23:58
【问题描述】:
给定零售管理系统的下表:
商店:store_id, name
产品:product_id, name, cost
PRODUCT_ENTRIES:key, store_id, date
PRODUCT_ENTRIES_CONTENT: product_entries_key, product_id, quantity
PRODUCT_EXITS:key, store_id, product_id, quantity, status, date
销售:key, store_id, date
SALES_CONTENT: sales_key, product_id, quantity
返回:key, store_id, date
RETURNS_CONTENT: returns_key, product_id, quantity
为了计算库存值,我遍历了 products 表的内容和每个 product_id:
- product_entries_content 和returns_content 的总数量
- 减去 product_exits_content(status = 2 或 3)以及 sales_content 的数量
为了计算每个商店的库存成本,我通过 PHP 循环 对每个不同的商店运行以下查询并输出结果:
SELECT
SUM((((
(SELECT COALESCE(SUM(product_entries_content.quantity), 0)
FROM product_entries
INNER JOIN product_entries_content ON
product_entries_content.product_entries_key = product_entries.key
WHERE product_entries_content.product_id = products.id
AND product_entries.store_id = '.$row['id'].'
AND DATE(product_entries.date) <= DATE(NOW()))
-
(SELECT COALESCE(SUM(quantity), 0)
FROM sales_content
INNER JOIN sales ON sales.key = sales_content.sales_key
WHERE product_id = products.product_id AND sales.store_id = '.$row['id'].'
AND DATE(sales_content.date) <= DATE(NOW()))
+
(SELECT COALESCE(SUM(quantity), 0)
FROM returns_content
INNER JOIN returns ON returns.key = returns_content.returns_key
WHERE product_id = products.product_id AND returns.store_id = '.$row['id'].'
AND DATE(returns.date) <= DATE(NOW()))
-
(SELECT COALESCE(SUM(quantity), 0)
FROM product_exits
WHERE product_id = products.product_id AND (status = 2 OR status = 3)
AND product_exits.store_id = '.$row['id'].' #store_id
AND DATE(product_exits.date) <= DATE(NOW()))
) * products.cost) / 100) ) AS "'.$row['key'].'" #store_name
FROM products WHERE 1
所有外键和索引都已正确设置。问题是由于每个商店的大量商店和移动,查询变得越来越繁重,并且因为库存是从每个商店的历史开始计算的,所以它只会随着时间的推移而变慢。
我可以做些什么来优化这个方案?
【问题讨论】:
-
别说
DATE(product_entries.date) <= DATE(NOW()),说product_entries.date <= CURRENT_DATE()。 (我假设您想在今天之后排除行?为什么会有这样的行?)
标签: php mysql query-optimization