使用GROUP BY

时间:2019-02-07 09:46:52

标签: mysql indexing group-by key inner-join

我正在使用2张桌子将包裹加入运输:

软件包

CREATE TABLE `packages` (
  `package` int(11) NOT NULL,
  `shipping` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `packages`
  ADD PRIMARY KEY (`package`,`shipping`);
COMMIT;

货运

CREATE TABLE `shippings` (
  `id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `shippings`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `shippings`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;COMMIT;

问题是当我尝试将包裹加入运输和GROUP BY时,例如计算每次运输中的包裹数:

SELECT s.id,COUNT(*) packages
FROM shippings s
INNER JOIN packages p ON s.id=p.shipping
GROUP BY s.id

具有5K出货量和10K包裹的记录记录了查询执行需要10多个秒的时间,也许我缺少一些键或索引?

2 个答案:

答案 0 :(得分:2)

您可能想为packages.shipping添加一个索引。您拥有的主键索引将不会在查询中使用,因为它将包作为第一级。

或者,您可以更改packages-table中主键列的顺序,但这取决于使用该表的其他查询。

答案 1 :(得分:0)

SELECT s.id,COUNT(*) packages
FROM shippings s
INNER JOIN packages p ON s.id=p.shipping
GROUP BY s.id

可以简化为

SELECT p.shipping AS id,
       COUNT(*) AS packages
FROM packages p
GROUP BY p.shipping

从那里,您需要一些索引 shipping开头。您可以交换PK中列的顺序,也可以添加INDEX(shipping)