У меня есть таблица клиента и таблица вопросника, и у них есть вопросник, и у вопросника, и у вопросника есть ответы, я не знаю, во-первых, проблема в дизайне модели, но приведенный ниже запрос возвращает 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'