优化 5 内连接
Posted
技术标签:
【中文标题】优化 5 内连接【英文标题】:Optimizing 5 inner join 【发布时间】:2019-02-13 03:57:45 【问题描述】:我有一个客户表和问卷表都有问卷答案,问卷答案和问题表都有答案,我不知道问题是不是首先在模型设计中,但是下面的查询返回了 4000 行客户大约 4 分钟。在 sql 和优化方面我是初学者,在索引方面几乎一无所知。谁能帮帮我?
在下面的查询中,我正在寻找在问题“平台”中回答“Facebook”的客户
我正在使用导轨。这些是我的模型
客户类别
class Customer < ApplicationRecord
has_many :questionnaire_answers, as: :answerable
end
questionnaire_answer 类
class QuestionnaireAnswer < ApplicationRecord
belongs_to :answerable, polymorphic: true
belongs_to :questionnaire
has_many :answers
end
问卷调查类
class Questionnaire < ApplicationRecord
has_many :questionnaire_answers, as: :answerable
has_many :questions
end
问题类
class Question < ApplicationRecord
has_many :answers
belongs_to :questionnaire
has_many :answer_options
end
answer_option 类
class AnswerOption < ApplicationRecord
has_many :answers
belongs_to :question
end
答题课
class Answer < ApplicationRecord
belongs_to :question
belongs_to :answer_option
belongs_to :questionnaire_answer
end
我的 sql
SELECT `customers`.* FROM `customers`
INNER JOIN `questionnaire_answers`
ON `questionnaire_answers`.`answerable_id` = `customers`.`id`
AND `questionnaire_answers`.`answerable_type` = 'Customer'
INNER JOIN `questionnaires`
ON `questionnaires`.`id` = `questionnaire_answers`.`questionnaire_id`
INNER JOIN `questions`
ON `questions`.`questionnaire_id` = `questionnaires`.`id`
INNER JOIN `answers`
ON `answers`.`question_id` = `questions`.`id`
INNER JOIN `answer_options`
ON `answer_options`.`id` = `answers`.`answer_option_id`
WHERE (questions.name = 'platform' and answer_options.answer LIKE '%Facebook%')
mysql解释结果
'1','SIMPLE','questionnaire_answers','ALL',NULL,NULL,NULL,NULL,'5','Using where'
'1','SIMPLE','customers','eq_ref','PRIMARY','PRIMARY','8','tech-consul_development.questionnaire_answers.answerable_id','1','Using where'
'1','SIMPLE','questionnaires','eq_ref','PRIMARY','PRIMARY','8','tech-consul_development.questionnaire_answers.questionnaire_id','1','Using where; Using index'
'1','SIMPLE','answers','ALL',NULL,NULL,NULL,NULL,'113','Using where; Using join buffer (Block Nested Loop)'
'1','SIMPLE','questions','eq_ref','PRIMARY','PRIMARY','8','tech-consul_development.answers.question_id','1','Using where'
'1','SIMPLE','answer_options','eq_ref','PRIMARY','PRIMARY','8','tech-consul_development.answers.answer_option_id','1','Using where'
【问题讨论】:
表结构是什么样的?没有表定义很难优化 抱歉,我会在几秒钟后添加 我添加了模型结构 不熟悉 ruby,也没有看到任何索引... 每张表都有自增主键,就是id,你是不是建议我在id旁边做一列pk? 【参考方案1】:如果它们不是主键,则在 WHERE 子句之后为列创建索引。并尝试将数据少的表放在SELECT子句的前面,并使用解释查询来检查
【讨论】:
你能扩展一下吗?以上是关于优化 5 内连接的主要内容,如果未能解决你的问题,请参考以下文章