GROUP BY优化

时间:2009-08-28 10:01:51

标签: mysql optimization group-by

嘿。我把这两张表格放在1:n关系中。

CREATE TABLE IF NOT EXISTS `de_locations` (
`id` int(11) NOT NULL auto_increment,
`user_id` int(11) default NULL,
`author_id` int(11) NOT NULL,
`city_id` int(11) NOT NULL,
`district_id` int(11) NOT NULL,
`title` varchar(150) collate utf8_unicode_ci NOT NULL,
`description` tinytext collate utf8_unicode_ci,
`lat` double NOT NULL,
`lng` double NOT NULL,
`stars` double default '0',
`comments` mediumint(9) default '0',
`flag` tinyint(4) default '0',
PRIMARY KEY  (`id`),
KEY `user_id` (`user_id`),
KEY `flag` (`flag`),
KEY `rating_district` (`district_id`,`stars`,`comments`),
KEY `rating_city` (`city_id`,`stars`,`comments`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=15 ;

CREATE TABLE IF NOT EXISTS `de_location2category` (
`id` int(11) NOT NULL auto_increment,
`location_id` int(11) NOT NULL,
`cat_id` mediumint(9) NOT NULL,
PRIMARY KEY  (`id`),
UNIQUE KEY `rel` (`location_id`,`cat_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=14 ;

位置可以放在多个类别中。

例如:

地点:“必胜客” 分类:“意大利美食”,“快餐”

这些类别是父类别食物的子类别。

现在我想选择食品类别中的所有地点。

SELECT a.id, a.title, a.description, a.street, a.hnr, ROUND(a.stars) as stars, a.comments, a.lat, a.lng
FROM de_locations as a 
INNER JOIN de_location2category as b
ON b.location_id = a.id
WHERE b.cat_id BETWEEN 0 AND 100 
AND a.city_id = 1000 
GROUP BY a.id
ORDER BY a.stars DESC, a.comments DESC

我需要GROUP BY,因为如果它们与多个类别相关,我不需要重复的位置。但是这个查询构建了一个临时表并使用了filesort。如果我离开GROUP BY一切都很好,但我需要它......

我必须添加另一个索引吗?或者我的计划有什么问题? 你会如何解决这个问题?非常感谢。

2 个答案:

答案 0 :(得分:1)

我认为您的问题是查询速度很慢。无需担心临时和文件排序,但为什么查询速度慢。 添加EXPLAIN {yourquery}的输出,以便我们检查究竟发生了什么。

或者您也可以尝试子查询:

SELECT a.id, a.title, a.description, a.street, a.hnr, ROUND(a.stars) as stars, a.comments, a.lat, a.lng
FROM de_locations as a 
WHERE 
a.id IN (SELECT DISTINCT b.location_id FROM de_location2category as b WHERE b.cat_id BETWEEN 0 AND 100)
AND a.city_id = 1000 
GROUP BY a.id
ORDER BY a.stars DESC, a.comments DESC

答案 1 :(得分:0)

为什么不使用DISTINCT a.id?