我正在加入两张桌子。 表unique_nucleosome_re有大约600,000条记录。 另一张表有20,000条记录。 奇怪的是性能和EXPLAIN的答案是不同的取决于 在WHERE子句中的条件。 什么时候 在哪里n.chromosome ='X' 花了大约3分钟。 什么时候 在哪里n.chromosome ='2L' 花了30多分钟才连接完毕。
SELECT n.name , t.transcript_start , n.start
FROM unique_nucleosome_re AS n
INNER JOIN tss_tata_range AS t
ON t.chromosome = n.chromosome
WHERE (t.transcript_start > n.end AND t.ts_minus_250 < n.start )
AND n.chromosome = 'X'
ORDER BY t.transcript_start
;
这是EXPLAIN的答案。 当WHERE是n.chromosome ='X'
时'1', 'SIMPLE', 'n', 'ALL', 'start_idx,end_idx,chromo_start', NULL, NULL, NULL, '606096', '48.42', 'Using where; Using join buffer'
当WHERE是n.chromosome ='2L'
时'1', 'SIMPLE', 'n', 'ref', 'start_idx,end_idx,chromo_start', 'chromo_start', '17', 'const', '68109', '100.00', 'Using where'
X或2L的记录数几乎相同。 我花了几天但我无法理解。这可能是一个我无法看到或可能是错误的简单错误。 你能帮帮我吗?
答案 0 :(得分:0)
首先,在没有看到任何索引信息的情况下,我会在您的TSS_TData_Range上有一个关于Chromosome键和transcript_start的索引(但是染色体键的最小值)。我还假设你的unique_nucleosome_re表上的染色体上有一个索引。然后,看起来TSS是你的SHORT表,所以我会把它移到查询的第一个位置并调用“STRAIGHT_JOIN”子句...
SELECT STRAIGHT_JOIN
n.name,
t.transcript_start,
n.start
FROM
tss_tdata_range t,
unique_nucleosome_re n
where
t.chromosome = 'X'
and t.chromosome = n.chromosome
and t.transcript_start > n.end
and t.ts_minus_250 < n.start
order by
t.transcript_start
如果它适合你,我也会对表现感兴趣......