【问题标题】:Slow performance on mysql query in Rails appRails 应用程序中 mysql 查询的性能缓慢
【发布时间】: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


【解决方案1】:

您可以简化查询,因为您没有使用 tags 表中的任何内容:

SELECT s.*
FROM `stories` s INNER JOIN
     `taggings` t
     ON t.`story_id` = s
WHERE t.id = 3141
ORDER BY s.hotness
LIMIT 26 OFFSET 0;

如果这没有帮助,这有多大?

SELECT count(*)
FROM `stories` s INNER JOIN
     `taggings` t
     ON t.`story_id` = s
WHERE t.id = 3141;

【讨论】:

    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    相关资源
    最近更新 更多