优化SQL,比JOIN更好的性能

时间:2013-12-09 17:23:14

标签: mysql sql join subquery

我有3个表,总共约有20万行。

我的桌子:

warehouse_stock

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.namebarcodemanufacturer_idwarehouse_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更好。

1 个答案:

答案 0 :(得分:0)

如果您只是在warehouse_stock.warehouse_idproduct_variants.ean上添加索引,则应该没有重写查询以使用子查询。由于将使用索引,查询将运行得更快。如果查询使用子查询,则会更慢。

此外,由于您GROUP BYws.barcode,因此行包含来自多个products的信息,因此p.name仅显示第一个产品名称组。每行不代表特定产品的计数,但是可能涵盖多个barcode的特定products的计数,因此p.name可能会在行中产生误导。