优化一个简单的MySQL查询来摆脱filesort

时间:2010-09-23 13:37:48

标签: mysql optimization

我有一个简单的mysql查询,服务器真的不喜欢它:

SELECT zone_id, SUM(inc_sec) AS voucher_used
  FROM cdr_bill_2010_09
 WHERE cust_id = 1234 AND voucher_id = 'XXXXXX'
 GROUP BY zone_id

现在这应该非常快(通常是),因为cust_id和voucher_id都有索引(选择了voucher_id)。但是它仍然使用帮助表。解释后:

           id: 1
  select_type: SIMPLE
        table: cdr_bill_2010_09
         type: ref
possible_keys: cust_id,voucher_id
          key: voucher_id
      key_len: 9
          ref: const
         rows: 1
        Extra: Using where; Using temporary; Using filesort

我可以做一些特定的事情来摆脱那些吗?我正在运行debian的5.0.45。

5 个答案:

答案 0 :(得分:2)

尝试添加另一个索引(根据http://forums.mysql.com/read.php?115,57443,59562):

CREATE INDEX index_zi ON cdr_bill_2010_09 (zone_id,inc_sec); 

答案 1 :(得分:0)

您是否正在索引voucher_id中的所有字节?

来自http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

  

您只索引列的前缀   在ORDER BY子句中命名。在这   情况下,索引不能用于   完全解决排序顺序。对于   例如,如果你有一个CHAR(20)   列,但索引只有前10个   字节,索引无法分辨   超过第10个字节的值和a   将需要filesort。

我知道这不是一个order by子句,但也许是相同的交易?

答案 2 :(得分:0)

您是否尝试过在其中创建包含cust_id和vendor_id的索引?

create index idx_cdr_bill_2010_09_joint on cdr_bill_2010_09(cust_id, vendor_id)

答案 3 :(得分:0)

实际答案与其他答案很接近。添加“where”键(voucher_id)(cust_id)以及“group”键(zone_id)的索引解决了问题。实际上zone_id本身足以摆脱额外的临时/文件输出,但是需要添加另一个来加速基本查询。

答案 4 :(得分:0)

  

在cdr_bill_2010_09上创建INDEX IDX_CDRBILL_CUST_VOUCH_ZONE(cust_id,   voucher_id,zone_id);