我正在使用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多个秒的时间,也许我缺少一些键或索引?
答案 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)
。