Оптимизация 5 внутренних соединений - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть таблица клиента и таблица вопросника, и у них есть вопросник, и у вопросника, и у вопросника есть ответы, я не знаю, во-первых, проблема в дизайне модели, но приведенный ниже запрос возвращает 4000 строк клиентав течение 4 минут.Я очень начинающий, когда дело доходит до SQL и оптимизации, и почти ничего не знаю, когда дело доходит до индекса.Кто-нибудь может мне помочь?

в приведенном ниже запросе я ищу клиентов, которые ответили «Facebook» в вопросе «платформа»

Я использую рельсы.Это мои модели

класс клиентов

class Customer < ApplicationRecord

has_many :questionnaire_answers, as: :answerable

end

вопросник_ответ класса

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

class AnswerOption < ApplicationRecord

has_many :answers
belongs_to :question

end

answer answer

class Answer < ApplicationRecord


belongs_to :question
belongs_to :answer_option
belongs_to :questionnaire_answer

end

my 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'

1 Ответ

0 голосов
/ 13 февраля 2019

Позвольте создать индекс для столбцов после предложения WHERE, если они не являются первичными ключами.И давайте сначала попробуем поместить таблицы с небольшими данными в предложении SELECT и использовать запрос объяснения для проверки

...