【发布时间】:2016-02-13 17:10:03
【问题描述】:
出于本文的目的,我已将我的问题简化为最纯粹的形式。 我有 3 个表:游戏、games_tags 和 games_tags_map
如果我想为每个游戏获取标签表,我会这样做:
SELECT `games_tags_map`.`game_id` as 'game_id', GROUP_CONCAT(`games_tags_map`.`tag_id`) as 'tags'
FROM `games_tags_map`
LEFT JOIN `games_tags` on `games_tags`.id = `games_tags_map`.`tag_id`
GROUP BY `games_tags_map`.game_id
大约需要 1 毫秒
SELECT `games`.`id` AS 'id' from `games`
这需要
但是,当我尝试加入这两个时:
SELECT `games`.`id` AS 'id',
t.`tags` as `tags`
FROM `games`
LEFT JOIN (
SELECT `games_tags_map`.`game_id` as 'game_id', GROUP_CONCAT(`games_tags_map`.`tag_id`) as 'tags'
FROM `games_tags_map`
LEFT JOIN `games_tags` on `games_tags`.id = `games_tags_map`.`tag_id`
GROUP BY `games_tags_map`.game_id
) t ON t.`game_id`=`games`.`id`
大约需要 100 毫秒
但是,当我执行等效查询时:
SELECT `games`.`id` AS 'id',
GROUP_CONCAT(DISTINCT `games_tags`.`tag`) AS 'tags'
FROM `games`
LEFT JOIN `games_tags_map` ON `games`.`id` = `games_tags_map`.`game_id`
LEFT JOIN `games_tags` ON `games_tags`.`id` = `games_tags_map`.`tag_id`
WHERE `games`.`active`=1
GROUP BY `games`.`id`
需要 2 毫秒... 但是,当我需要按主列 (id) 以外的任何内容对其进行排序时,大约需要 80 毫秒
澄清一下,这是我实际数据库的一个非常简化的版本,它的加载时间要长得多,并导致我的网站出现问题,但问题出在这些查询中。
我的数据库设置方式显然存在缺陷,以适应如此巨大不同的加载时间。我尝试添加更多索引,但没有帮助。 在“游戏”表上,我有主索引“id” 在表 'games_authors_map' 上,主索引由 'game_id' 和 'author_id' 组成
我知道有问题,但我无法解决它,我不明白为什么。
请帮忙。
【问题讨论】: