MySQL 查询执行时间过长。查询 returns 不错的结果,但可能是设计的不好

MySQL query executes too long. Query returns good results, but maybe it is not good designed

这是针对我的问题的 SQL Fiddle:http://sqlfiddle.com/#!9/8ad87/2

我有tables:群组优惠offers_groups.

组有名称,但这些名称有分配给它们的特殊 ID。 ID 不是自动递增的,它们是这样预定义的。

这里是groupstable的一小部分:

id name 0300000 Agro 0310000 Fruits 0311000 Peach 0320000 Vegetables

offers table 中存储了个人和公司提供的报价:

id offer 1 Selling fruits 2 Selling peanuts 3 Selling Vegetables 4 Selling peach 5 We do Agro 6 We sell Peach 7 We sell Vegetables 8 We transport Vegetables 9 We transport Peaches

offers_groupstable负责连接这两个:

id offer_id group_id 1 1 3100000 2 2 0300000 3 3 0311000 4 4 0300000 5 5 0311000 6 6 0320000 7 7 0320000 8 3 0311000

我需要计算哪些组的报价最多并将这些组显示给用户。

这是我的查询:

SELECT og.id, og.offer_id, og.group_id,
       o.id, o.offer,
       g.id, g.name,
       COUNT(og.offer_id) AS offersCount

FROM `offers_groups` og 

JOIN `offers` o ON og.offer_id = o.id
JOIN `groups` g ON og.group_id = g.id

GROUP BY og.group_id

ORDER BY offersCount DESC

LIMIT 2

我的 SQL Fiddle 中的代码正在运行,我认为它给了我正确的结果,但是在这些 table 有大量数据的真实数据库中,这查询正在执行 25 秒。而且我不相信这是因为列索引,对吗?我希望某些专家可以告诉我我的查询是否设计不当。我能否在获得正确结果的同时加快速度?

谢谢

首先,您 select 中的所有列都没有意义。他们应该只在 "group" 级别,而不是 "offer group" 级别。所以,让我专注于这个查询:

SELECT g.id, g.name,
       COUNT(og.offer_id) AS offersCount
FROM `offers_groups` og JOIN
     `offers` o
     ON og.offer_id = o.id JOIN
     `groups` g
     ON og.group_id = g.id
GROUP BY g.id
ORDER BY offersCount DESC
LIMIT 2;

其次,在任何结构合理的数据库中,您实际上并不需要 offers table -- 外键关系应确保行实际存在。所以,试试这个:

SELECT g.id, g.name,
       COUNT(og.offer_id) AS offersCount
FROM `offers_groups` og JOIN
     `groups` g
     ON og.group_id = g.id
GROUP BY g.id
ORDER BY offersCount DESC
LIMIT 2;

然后,根据您的 SQL Fiddle,您的 table 没有索引。将所有 id 定义为主键。例如:

CREATE TABLE IF NOT EXISTS `offers` (
    `id` int(11) NOT NULL PRIMARY KEY,
    `offer` varchar(255) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=10 ;

使用主键应该可以解决您的性能问题。