Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用内部联接优化查询_Mysql_Sql - Fatal编程技术网

Mysql 如何使用内部联接优化查询

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

我的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.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、标签)

用于查找瓶颈您可以尝试使用联接替换子查询-有时可能会更快。