优化 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 内连接的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中join连接,内连接,外连接,连接算法,优化

Postgresql 内连接(尤其是自连接)上的多列优化

如何优化这个 sql 查询(内连接)

多个内连接和子查询的查询优化

在 3 个大表上使用内连接优化 SQL 查询

MySQL实验 内连接优化order by+limit 以及添加索引再次改进