2012-08-14 43 views
1

我有一个查询在有50万行的表上运行。我在列上有一个名为wafer_name_date的复合索引(wafer_name,date)。通过添加索引,此查询现在需要0.06秒,但仍使用临时表和文件夹报告。有什么办法可以避免这种情况?谢谢!MySQL SELECT DISTINCT ... ORDER BY没有临时表或文件夹

EXPLAIN SELECT DISTINCT wafer_name FROM flash ORDER BY date\G 
*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: flash 
     type: range 
possible_keys: NULL 
      key: wafer_name_date 
     key_len: 767 
      ref: NULL 
     rows: 4308 
     Extra: Using index for group-by; Using temporary; Using filesort 
+0

什么是你的表格结构? ('SHOW CREATE TABLE your_table'的结果) – Jocelyn 2012-08-14 16:34:06

回答

2

您的查询是有点尴尬,因为“日期”是不是在结果集中包括在内。但是,您正在按日期排序。我希望是这样的:

select wafer_name, min(date) 
from flash 
group by wafe_name 
order by min(date) 

正如解释说,利用分组(不同)值指标的执行计划。这将为wafer_name生成一个值,并为日期生成一个任意值。它从索引中抽取任意日期(而不是在相应的页面上查找)。

但是,它需要按日期对结果进行排序。它不能使用您定义的索引,因为这是由wafer_name开始的,并且每个wafer_name只有一个日期。所以它可以保存数据并进行排序。

我想不出一个办法解决这个问题。