Mysql 如何使用内部联接优化查询
我的mysql查询太慢了,我不知道如何优化它。我的webapp无法加载此查询,因为运行时间太长,而且Web服务器获取结果的时间有限Mysql 如何使用内部联接优化查询,mysql,sql,Mysql,Sql,我的mysql查询太慢了,我不知道如何优化它。我的webapp无法加载此查询,因为运行时间太长,而且Web服务器获取结果的时间有限 SELECT rc.trial_id, rc.created, rc.date_registration, rc.agemin_value, rc.agemin_unit, rc.agemax_value, rc.agemax_unit, rc.exclusion_criteria, rc.st
SELECT rc.trial_id,
rc.created,
rc.date_registration,
rc.agemin_value,
rc.agemin_unit,
rc.agemax_value,
rc.agemax_unit,
rc.exclusion_criteria,
rc.study_design,
rc.expanded_access_program,
rc.number_of_arms,
rc.enrollment_start_actual,
rc.target_sample_size,
(select name from repository_institution where id = rc.primary_sponsor_id) as
primary_sponsor,
(select label from vocabulary_studytype where id = rc.study_type_id) as study_type,
(select label from vocabulary_interventionassigment where id =
rc.intervention_assignment_id) as intervention_assignment,
(select label from vocabulary_studypurpose where id = rc.purpose_id) as study_purpose,
(select label from vocabulary_studymasking where id = rc.masking_id) as study_mask,
(select label from vocabulary_studyallocation where id = rc.allocation_id) as
study_allocation,
(select label from vocabulary_studyphase where id = rc.phase_id) as phase,
(select label from vocabulary_recruitmentstatus where id = rc.recruitment_status_id) as
recruitment_status,
GROUP_CONCAT(vi.label)
FROM
repository_clinicaltrial rc
inner JOIN repository_clinicaltrial_i_code rcic ON rcic.clinicaltrial_id = rc.id JOIN
vocabulary_interventioncode vi ON vi.id = rcic.interventioncode_id
GROUP BY rc.id;
使用内部联接代替联接可能是一个解决方案?更改为联接而不是每行连续选择肯定会有所改进。另外,由于您使用的是MySQL,因此使用关键字“STRAIGHT_JOIN”会告诉MySQL按照我提供的顺序进行查询。由于您的“rc”表是主表,而所有其他表都是查找表,这将使MySQL在该上下文中使用它,而不是希望其他一些查找表成为其余联接的基础
SELECT STRAIGHT_JOIN
rc.trial_id,
rc.created,
rc.date_registration,
rc.agemin_value,
rc.agemin_unit,
rc.agemax_value,
rc.agemax_unit,
rc.exclusion_criteria,
rc.study_design,
rc.expanded_access_program,
rc.number_of_arms,
rc.enrollment_start_actual,
rc.target_sample_size,
ri.name primary_sponsor,
st.label study_type,
via.label intervention_assignment,
vsp.label study_purpose,
vsm.label study_mask,
vsa.label study_allocation,
vsph.label phase,
vrs.label recruitment_status,
GROUP_CONCAT(vi.label)
FROM
repository_clinicaltrial rc
JOIN repository_clinicaltrial_i_code rcic
ON rc.id = rcic.clinicaltrial_id
JOIN vocabulary_interventioncode vi
ON rcic.interventioncode_id = vi.id
JOIN repository_institution ri
on rc.primary_sponsor_id = ri.id
JOIN vocabulary_studytype st
on rc.study_type_id = st.id
JOIN vocabulary_interventionassigment via
on rc.intervention_assignment_id = via.id
JOIN vocabulary_studypurpose vsp
ON rc.purpose_id = vsp.id
JOIN vocabulary_studymasking vsm
ON rc.masking_id = vsm.id
JOIN vocabulary_studyallocation vsa
ON rc.allocation_id = vsa.id
JOIN vocabulary_studyphase vsph
ON rc.phase_id = vsph.id
JOIN vocabulary_recruitmentstatus vrs
ON rc.recruitment_status_id = vrs.id
GROUP BY
rc.id;
最后一个音符。您正在使用GROUP BY并将其应用于组_CONCAT(),这是正常的。但是,适当的groupby表示需要按所有非聚合列进行分组,在本例中,非聚合列是列表中的每一列。您可能知道这一点,并且基于“rc”相关列的查找将是相同的,但这样做不是好的做法。您的联接和子查询可能不是问题所在。假设表上有正确的索引,那么这些索引速度很快。“正确索引”意味着
id
列是主键
——这是一个非常合理的假设
我的猜测是,groupby
是性能问题。因此,我建议在查询结构中不使用“groupby”:
select . . .
(select group_concat(vi.label)
from repository_clinicaltrial_i_code rcic
vocabulary_interventioncode vi
on vi.id = rcic.interventioncode_id
where rcic.clinicaltrial_id = rc.id
)
from repository_clinicaltrial rc ;
为此,您希望索引位于:
repository\u clinicaltrial\u i\u code(clinicaltrial\u id,interventioncode\u id)
词汇\u干预代码(id、标签)