从4个表中提取数据的最快方法

时间:2018-05-07 20:55:43

标签: mysql

我是堆栈溢出的新手,也是mysql的新手。我有4个以下4个表

第一张表是“圆形”表。

       "Round" Table
+----+-------+-------+--------+
| ID | Round | order | Basket |
+----+-------+-------+--------+
| 1  | 159   | 1111  | 121    |
| 2  | 160   | 1112  | 61     |
| 3  | 161   | 1114  | 93     |
| 4  | 162   | 1113  | 25     |
| 5  | 161   | 1115  | 39     |
| 6  | 163   | 1118  | 61     |
| .  | .     | .     | .      |
| .  | .     | .     | .      |
| .  | .     | .     | .      |
+----+-------+-------+--------+

第二个表是“供应商”表,所有供应商名称都保存在其中。

"Supplier" Table
+----+---------+
| ID |  Name   |
+----+---------+
| 1  | Samsung |
| 2  | Nokia   |
| 3  | LG      |
| 4  | Xiaomi  |
| 5  | Siemens |
| 6  | Bosch   |
| .  | .       |
| .  | .       |
| .  | .       |
+----+---------+

第3个是“购物车”表

           "Cart" Table
+-----+-------+--------------+
| ID  | order | Suppliername |
+-----+-------+--------------+
| 365 | 1119  | Siemens      |
| 366 | 1112  | Bitten       |
| 367 | 1118  | Xiaomi       |
| 368 | 1114  | Siemens      |
| 369 | 1114  | Siemens      |
| 370 | 1114  | Bosch        |
| 371 | 1115  | Xiaomi       |
| .   | .     | .            |
+-----+-------+--------------+

第4个表是“Logistic”表和ID和顺序此表中的列来自“Cart”表但不是所有Cart.ID都在Logistic表中

             "Logistic" Table
+--------+-------+--------+------+----------+
| CartID | order | packed | sent | splitted |
+--------+-------+--------+------+----------+
| 364    | 986   | 1      | 0    | 0        |
| 365    | 1119  | 0      | 0    | 1        |
| 366    | 1112  | 1      | 0    | 0        |
| 367    | 1118  | 1      | 0    | 0        |
| 368    | 1114  | 1      | 1    | 0        |
| 369    | 1114  | 0      | 0    | 1        |
| 370    | 1114  | 1      | 0    | 0        |
| 371    | 1115  | 0      | 0    | 0        |
| .      | .     | .      | .    | .        |
| .      | .     | .      | .    | .        |
| .      | .     | .      | .    | .        |
+--------+-------+--------+------+----------+

我想得到/选择suppliername,count(Cart.ID),count(Logistic.packed),count(Logistic.sent)通过jut输入一些Rounds.Round来获得Rounds.Round = 161的结果应该看起来像什么像这样

+--------------+----------+--------+
| Suppliername | Expected | Packed |
+--------------+----------+--------+
| Xiaomi       | 1        | 1      |
| Siemens      | 2        | 1      |
| Bosch        | 1        | 1      |
| .            | .        | .      |
| .            | .        | .      |
+--------------+----------+--------+

我已经编写了以下查询来获取供应商和预期数据,但其速度慢且取得> 20秒:

select l.Name,
   (select Count(*) 
    from Cart e 
    where e.Suppliername = l.Name 
    AND e.order in (
        SELECT p.order from Rounds p where p.Round = 161)
    ) as Expected
from Supplier l

有没有办法比这更快地提取数据?也许我需要使用索引,我应该在哪里使用索引?

1 个答案:

答案 0 :(得分:0)

MySQL倾向于优化WHERE ... IN (SELECT ...)JOIN通常效果更好。

SELECT l.name, IFNULL(e.count, 0) AS expected
FROM supplier AS l
LEFT JOIN (
    SELECT c.suppliername, COUNT(*) count
    FROM cart AS c
    JOIN (SELECT DISTINCT order
          FROM Rounds
          WHERE Round = 161) AS r
    ON c.order = r.order
    GROUP BY c.suppliername
) AS e ON l.name = e.suppliername

您应该在supplier.namecart.suppliernamecart.order上拥有索引。 (cart.suppliername, cart.order)上的综合索引可能是最好的。