我有这段代码:
select transcript_features.*,
transcript_features_blast.hit, transcript_features_blast.evalue,
transcript_features_blast.swissprot_version,
transcript_features_premirna_family.family, transcript_features_premirna_family.evalue,
transcript_features_premirna_family.rfam_version,
transcript_features_premirna_homology.hit, transcript_features_premirna_homology.evalue,
transcript_features_premirna_homology.mirbase_version,
transcript_features_premirna.premirna,
transcript_features_transposons.hit, transcript_features_transposons.dfam_version,
confidence.confidence, expression.expression, expression.tissue, expression.conditions
from transcript_features_premirna, gene_transcripts, transcript_features_transposons, confidence, transcript_features
left join transcript_features_blast on transcript_features_blast.transcript_alias=transcript_features.transcript_alias
left join transcript_features_premirna_family on transcript_features_premirna_family.transcript_alias=transcript_features.transcript_alias
left join transcript_features_premirna_homology on transcript_features_premirna_homology.transcript_alias=transcript_features.transcript_alias
left join expression on expression.transcript_alias=transcript_features.transcript_alias
where transcript_features.transcript_alias=gene_transcripts.transcript_alias and gene_transcripts.gene_alias="AT1G19392" and transcript_features_premirna.transcript_alias=transcript_features.transcript_alias and transcript_features_transposons.transcript_alias=transcript_features.transcript_alias and confidence.transcript_alias=transcript_features.transcript_alias;
此代码工作正常。然而,当我引入一个额外的left join
:
select transcript_features.*,
transcript_features_blast.hit, transcript_features_blast.evalue,
transcript_features_blast.swissprot_version,
transcript_features_premirna_family.family, transcript_features_premirna_family.evalue,
transcript_features_premirna_family.rfam_version,
transcript_features_premirna_homology.hit, transcript_features_premirna_homology.evalue,
transcript_features_premirna_homology.mirbase_version,
transcript_features_premirna.premirna,
transcript_features_transposons.hit, transcript_features_transposons.dfam_version,
confidence.confidence, expression.expression, expression.tissue, expression.conditions
from transcript_features_premirna, gene_transcripts, transcript_features_transposons, confidence, transcript_features
left join transcript_features_blast on transcript_features_blast.transcript_alias=transcript_features.transcript_alias
left join transcript_features_premirna_family on transcript_features_premirna_family.transcript_alias=transcript_features.transcript_alias
left join transcript_features_premirna_homology on transcript_features_premirna_homology.transcript_alias=transcript_features.transcript_alias
left join expression on expression.transcript_alias=transcript_features.transcript_alias
left join transcript_names on transcript_names.transcript_alias=transcript_features.transcript_alias
where transcript_features.transcript_alias=gene_transcripts.transcript_alias and gene_transcripts.gene_alias="AT1G19392" and transcript_features_premirna.transcript_alias=transcript_features.transcript_alias and transcript_features_transposons.transcript_alias=transcript_features.transcript_alias and confidence.transcript_alias=transcript_features.transcript_alias;
永恒,永远不会结束。为什么?如果我删除一个随机left join
,它可以很好地工作,并且我得到的结果不到0.30秒。也许,left join
s太多了?
使用explain
:
+----+-------------+---------------------------------------+--------+---------------+---------+---------+---------------------------------------------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------------------------------+--------+---------------+---------+---------+---------------------------------------------+-------+-------------+
| 1 | SIMPLE | confidence | ALL | PRIMARY | NULL | NULL | NULL | 75858 | |
| 1 | SIMPLE | transcript_features | eq_ref | PRIMARY | PRIMARY | 42 | GreeNC.confidence.transcript_alias | 1 | |
| 1 | SIMPLE | transcript_features_blast | eq_ref | PRIMARY | PRIMARY | 42 | GreeNC.confidence.transcript_alias | 1 | |
| 1 | SIMPLE | transcript_features_premirna_family | eq_ref | PRIMARY | PRIMARY | 42 | GreeNC.confidence.transcript_alias | 1 | |
| 1 | SIMPLE | transcript_features_premirna_homology | ALL | NULL | NULL | NULL | NULL | 9530 | |
| 1 | SIMPLE | expression | ALL | NULL | NULL | NULL | NULL | 75844 | |
| 1 | SIMPLE | transcript_names | eq_ref | PRIMARY | PRIMARY | 42 | GreeNC.transcript_features.transcript_alias | 1 | Using index |
| 1 | SIMPLE | transcript_features_transposons | eq_ref | PRIMARY | PRIMARY | 42 | GreeNC.transcript_features.transcript_alias | 1 | Using where |
| 1 | SIMPLE | transcript_features_premirna | eq_ref | PRIMARY | PRIMARY | 42 | GreeNC.transcript_features.transcript_alias | 1 | Using where |
| 1 | SIMPLE | gene_transcripts | eq_ref | PRIMARY | PRIMARY | 42 | GreeNC.transcript_features.transcript_alias | 1 | Using where |
+----+-------------+---------------------------------------+--------+---------------+---------+---------+---------------------------------------------+-------+-------------+
答案 0 :(得分:1)
编写此查询的更合适的方法可能如下:
SELECT f.*
, b.hit b_hit
, b.evalue b_evalue
, b.swissprot_version
, pf.family
, pf.evalue pf_evalue
, pf.rfam_version
, ph.hit ph_hit
, ph.evalue ph_value
, ph.mirbase_version
, p.premirna
, t.hit t_hit
, t.dfam_version
, c.confidence
, e.expression
, e.tissue
, e.conditions
FROM transcript_features f
JOIN gene_transcripts gt
ON gt.transcript_alias = f.transcript_alias
JOIN transcript_features_premirna p
ON p.transcript_alias = f.transcript_alias
JOIN transcript_features_transposons t
ON t.transcript_alias = f.transcript_alias
JOIN confidence c
ON c.transcript_alias = f.transcript_alias
LEFT
JOIN transcript_features_blast b
ON b.transcript_alias = f.transcript_alias
LEFT
JOIN transcript_features_premirna_family pf
ON pf.transcript_alias = f.transcript_alias
LEFT
JOIN transcript_features_premirna_homology ph
ON ph.transcript_alias = f.transcript_alias
LEFT
JOIN expression e
ON e.transcript_alias = f.transcript_alias
WHERE gt.gene_alias = "AT1G19392";