【发布时间】:2021-12-14 15:33:18
【问题描述】:
我正在尝试使用“物化视图”来优化远离联接的查询性能。下面的第一个查询是原始查询,它使用连接。第二个是针对我生成的表编写的查询,该表包括所有连接数据(相当于物化视图)。它们都返回相同的结果集。不幸的是,不知何故,第二个查询在处理一组很长的输入 ID(IN 子句)时要慢得多。我不明白这怎么可能!!!!执行所有连接必须有相当数量的过热,这可以通过“物化视图”来保存,对吧?
SELECT
clinical_sample.INTERNAL_ID AS "internalId",
sample.STABLE_ID AS "sampleId",
patient.STABLE_ID AS "patientId",
clinical_sample.ATTR_ID AS "attrId",
cancer_study.CANCER_STUDY_IDENTIFIER AS "studyId",
clinical_sample.ATTR_VALUE AS "attrValue"
FROM clinical_sample
INNER JOIN sample ON clinical_sample.INTERNAL_ID = sample.INTERNAL_ID
INNER JOIN patient ON sample.PATIENT_ID = patient.INTERNAL_ID
INNER JOIN cancer_study ON patient.CANCER_STUDY_ID =
cancer_study.CANCER_STUDY_ID
WHERE cancer_study.CANCER_STUDY_IDENTIFIER = 'xxxxx'
AND sample.STABLE_ID IN
('P-0068343-T02-IM7' , 'P-0068353-T01-IM7' ,
'P-0068363-T01-IM7' , 'P-0068364-T01-IM7' )
AND clinical_sample.ATTR_ID IN
(
'CANCER_TYPE'
);
SELECT
internalId,
sampleId,
patientId,
attrId,
studyId,
attrValue
FROM test
WHERE
sampleId IN ('P-0068343-T02-IM7' , 'P-0068353-T01-IM7' ,
'P-0068363-T01-IM7' , 'P-0068364-T01-IM7' )
AND studyId = 'xxxxx'
AND attrId = 'CANCER_TYPE';
更新:我确实在 Workbench 报告中注意到,带有连接的查询似乎扫描的行数要少得多。第二个无连接查询大约为 829k 与 ~2400k。因此,以某种方式,加入似乎实际上是一项重大优化。我在 sampleId、studyId、attrId 和这三者的复合中都有索引。
表“test”和“clinical_sample”的行数相同。
【问题讨论】:
-
将
(studyId, attrId, sampleId)上的复合索引添加到test表中。 -
感谢@Barmar,它已经拥有该索引。也是列上的单个索引。我确实在 Workbench 中注意到,带有连接的查询似乎扫描的行数要少得多。第一个约为 829k,而第一个约为 2400k。
标签: mysql sql join optimization database-optimization