【发布时间】: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