【问题标题】:MySQL performance in Ruby on RailsRuby on Rails 中的 MySQL 性能
【发布时间】:2011-09-05 10:37:01
【问题描述】:

我目前在使用 MySQL 时遇到了一些性能问题,并试图提出解决方案。我已经为各种表添加了一些索引,它似乎从查询长度中减少了数百毫秒,但我想知道是否可以优化以下内容:

负责这个的代码相当大,可以在下面发布,但总的来说:

  • 一份简历有很多desired_occupation(= 职业模型)
  • 一份简历有许多过去的职业(= 职业模型)
  • 一份简历有很多职业技能(= 技能模型)
  • 一份简历包含许多education_skills(=技能模型)
  • 一个职业有很多技能
  • 一个职业属于一个概念
  • 技能属于概念
  • 一个概念有很多并且属于一个概念

我知道在没有模型的情况下执行此操作有点棘手,但帖子对字符数量有限制。日志中的大部分查询如下所示:

  Language Load (0.0ms)
  SELECT `languages`.* FROM `languages` WHERE `languages`.`code` = 'en' LIMIT 1   Skill Load (1.0ms)  SELECT `skills`.* FROM `skills` INNER JOIN `occupation_skills` ON `skills`.id = `occupation_skills`.skill_id WHERE ((`occupation_skills`.occupation_id = 156))

  Concept Load (1.0ms)
  SELECT `concepts`.* FROM `concepts` WHERE `concepts`.`id` = 10 LIMIT 1 ConceptLabel Load (1.0ms)  SELECT `concept_labels`.* FROM `concept_labels` INNER JOIN `labels` ON `labels`.`id` = `concept_labels`.`label_id` WHERE `concept_labels`.`concept_id` = 10 AND `labels`.`language_id` = 1 LIMIT 1

  Label Load (1.0ms)
  SELECT `labels`.* FROM `labels` WHERE `labels`.`id` = 5432 LIMIT 1

其中一些直接来自缓存,如下所示:

  CACHE (0.0ms)
  SELECT `concept_labels`.* FROM `concept_labels` INNER JOIN `labels` ON `labels`.`id` = `concept_labels`.`label_id` WHERE `concept_labels`.`concept_id` = 10 AND `labels`.`language_id` = 1 LIMIT 1

  CACHE (0.0ms)
  SELECT `labels`.* FROM `labels` WHERE `labels`.`id` = 5432 LIMIT 1

  CACHE (0.0ms)
  SELECT `concept_labels`.* FROM `concept_labels` INNER JOIN `labels` ON `labels`.`id` = `concept_labels`.`label_id` WHERE `concept_labels`.`concept_id` = 10 AND `labels`.`language_id` = 1 LIMIT 1   CACHE (0.0ms)  SELECT `labels`.* FROM `labels` WHERE `labels`.`id` = 5432 LIMIT 1

  CACHE (0.0ms)
  SELECT `concept_labels`.* FROM `concept_labels` INNER JOIN `labels` ON `labels`.`id` = `concept_labels`.`label_id` WHERE `concept_labels`.`concept_id` = 10 AND `labels`.`language_id` = 1 LIMIT 1

  CACHE (0.0ms)
  SELECT `labels`.* FROM `labels` WHERE `labels`.`id` = 5432 LIMIT 1

其中最重的查询是

Label Load (56.0ms)
SELECT `labels`.* FROM `labels` WHERE (`labels`.`id` IN (9909,9888,9855,9822,9900,9867,9834,9912,9891,9879,9846,9813,9870,9858,9825,9903,9882,9837,9804,9894,9861,9849,9816,9873,9840,9828,9796,9906,9885,9852,9807,9897,9864,9831,9819,9876,9843,9810))

但输出仍然需要很长时间才能按我的喜好加载:

Rendered static/categorize.html.haml within layouts/application (515.1ms)
Completed 200 OK in 1651ms (Views: 424.0ms | ActiveRecord: 188.0ms)

是否还缺少其他内容,因为上次我检查了 188 + 424ms != 1651ms... 在运行性能测试时,根据 JMeter 最多需要 8 秒才能收到正确的响应...

【问题讨论】:

    标签: mysql ruby-on-rails performance


    【解决方案1】:

    考虑eager loading your associations(如果您还没有)尝试进一步优化您的查询。如果没有,您可能需要考虑使用 Redis 等中间存储并针对它执行查询,并可能在需要时使用 Resque 进行“同步”。

    请记住,Redis 是一个 NoSQL 数据存储,完全在 RAM 中运行,因此至少可以说很快。

    【讨论】:

    • 我稍后会研究这些范围。
    猜你喜欢
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2013-02-01
    • 1970-01-01
    相关资源
    最近更新 更多