我有一个简单的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。
答案 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);