【发布时间】:2013-12-09 17:23:13
【问题描述】:
我有 3 个表,总共大约 20 万行。
我的桌子:
仓库库存
id | barcode | quantity | warehouse_id
-------------------------------------------------
1 | 2211345661 | 21 | 1
2 | 2211345661 | 2 | 2
3 | 3452543234 | 1 | 2
4 | 3452543235 | 1 | 1
5 | 3452543236 | 1 | 1
6 | 3452543242 | 1 | 1
7 | 3452543245 | 1 | 1
8 | 3452543245 | 1 | 3
9 | 3452543245 | 1 | 1
product_variants
id | ean(barcode) | product_id
-------------------------------------
1 | 3452543245 | 14
2 | 3452543234 | 15
3 | 3452543245 | 16
4 | 3452543245 | 17
5 | 2211345661 | 18
6 | 2211345661 | 19
产品
id | name | color | manufacturer_id
------------------------------------------------
14 | Sample 1 | Red | 1
15 | Sample 2 | Black | 1
16 | Sample 3 | White | 1
17 | Sample 4 | White | 1
18 | Sample 5 | Orange | 2
19 | Sample 6 | Pink | 2
我只想显示SUM(quantity)、product.name、barcode、manufacturer_id 和warehouse_id。除了条形码编号之外没有任何关系。
这是我的代码:
SELECT
SUM(ws.quantity) AS total_q,
p.name,
ws.barcode,
p.manufacturer_id,
ws.warehouse_id
FROM warehouse_stock AS ws
INNER JOIN product_variants AS pv ON pv.ean = ws.barcode
INNER JOIN products AS p ON p.id = pv.product_id
WHERE ws.warehouse_id = 1 AND p.manufacturer_id = 1
GROUP BY ws.barcode
它有效,但主要是因为该查询已关闭。然后我们必须重新启动它。
如何更改它以使用子查询?
PS:sql 上没有索引。并且没有索引权限。所以,我想要你的建议。对于这样的查询,子查询可能比 JOIN 更好。
【问题讨论】:
-
主要问题是缺少索引
-
你能在查询上运行 EXPLAIN 并发布吗?
-
第一个问题和提高性能最简单最好的方法:“sql 上没有索引。”第二:
AND ws.stock_location_id = 1181的重复是怎么回事?第三:JOINs 几乎总是比子查询快。我不确定是不是故意的,但如果一个产品有四个变体,数量将被计算四次。 -
表上的字段比较多,但是上面我没写。
-
所有表 sendspace.com/filegroup/vlBktwpCXIAf2SnWe%2B2XYaXmP7SjFWIb 编辑:@G-Nugget 抱歉 ws.stock_location_id 被多次复制,idk 为什么...我修复了它...