Ruby on Rails 中的 MySQL 性能

标签 mysql ruby-on-rails performance

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

负责此的代码非常大,无法在下面发布,但总的来说:

  • 一份简历有很多 desired_occupation(= 职业模型)
  • 一份简历有很多 past_occupations(= 职业模型)
  • 一份 CV 有很多 occupational_skills(= 技能模型)
  • 一份简历有很多 educational_skills(= 技能模型)
  • 一个职业有很多技能
  • 一个职业属于一个概念
  • 技能属于概念
  • 一个Concept有很多并且属于一个Concept

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

  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 秒才能收到正确的响应...

最佳答案

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

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

关于Ruby on Rails 中的 MySQL 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7306841/

相关文章:

php - 从结果计算日期的最佳方法?

php - 如何使用数据库中的tinymce显示页面

ruby-on-rails - 如何使用 HAML 生成 simple_form View ?

python - App Engine 中最快/最有效的本地文件读取或内存缓存命中?

python - 矩阵向量差的有效元素级argmin

java - EDT 是否可能有太多工作?

mysql - SQL 查询语法错误,其中语法似乎是正确的

mysql - 可空列的行为不一样

ruby-on-rails - Rails 和 Redis

ruby-on-rails - ActiveRecord 上的 setter 覆盖问题