MySQL慢查询和EXPLAIN给出了奇怪的答案

时间:2011-01-11 18:17:29

标签: mysql optimization

我正在加入两张桌子。 表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的记录数几乎相同。 我花了几天但我无法理解。这可能是一个我无法看到或可能是错误的简单错误。 你能帮帮我吗?

1 个答案:

答案 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

如果它适合你,我也会对表现感兴趣......