【发布时间】:2014-01-25 19:31:59
【问题描述】:
我在 mysql 中有三个用于 Rails 应用程序的表:
- stories(id, title, summary, hotness) => 有 217754 条记录
- tags(id, name) => 有 25123 条记录
- taggings(story_id, tag_id) => 有 800751
这是来自 Rails 的日志:
故事加载(14300.8ms)
SELECT `stories`.*
FROM `stories` INNER JOIN
`taggings`
ON `taggings`.`story_id` = `stories`.`id` INNER JOIN
`tags` ON `tags`.`id` = `taggings`.`tag_id`
WHERE (tags.id = 3141)
ORDER BY hotness
LIMIT 26 OFFSET 0
需要超过 14 秒。我确信故事、标签和标签中的所有索引都可以。 还有一点不得不说,热度总是在变化的。
这是关于 MySql 的可扩展性吗?
PS: 解释结果 => https://gist.github.com/iCEAGE/8622705
【问题讨论】:
-
EXPLAIN 对该查询的输出是什么?如果您为查询执行 SELECT count(*),您会得到合理的结果吗?
-
这与 MySQL 的可扩展性无关。这可能与您的索引错误或与该特定标签匹配的 lot 数据有关。请张贴您在桌子上的索引。
-
@scraatz EXPLAIN 输出添加到 PS。 SELECT count(*) 有一个合理的结果,大约是 0.3s
-
解释表明您的索引是正确的,mysql 不需要时间来执行查询(集合中的 3 行(0.02 秒))。似乎是加载故事的 Rails 代码中的一个问题。我不了解 Rails,但我在对象关系映射框架(如 Hibernate)中看到了问题,其中在加载对象时会加载对象的所有关系。这可能是你的问题吗?
-
@scraatz 这与 Rails 无关,因为它也发生在 mysql 命令中
标签: mysql sql ruby-on-rails performance