2011-12-02 160 views
0

我的SQL查询优化我查询简单的查询

SELECT r.*,u.name AS name, u.username AS username 
FROM jos_js_res_record AS r 
LEFT JOIN jos_users AS u on u.id = r.user_id 
LEFT JOIN jos_js_res_record_values AS f on f.record_id = r.id AND f.field_type = 'digits' 
AND f.field_label = 'Price' 
WHERE r.section_id = 2 
AND MATCH (fieldsdata) AGAINST ('article' IN NATURAL LANGUAGE MODE) 
AND r.title like 'A%' 
ORDER BY f.field_value + 0 desc, f.field_value desc 

我不知道为什么,但它产生解释“利用地方;使用临时;使用filesort。我尽我所知来优化这个查询,但没有结果。据我所知这是因为加入了jos_js_res_record_valuesORDER BY。如果我评论ORDER BY或将其更改为ORDER BY r.created使用临时消失。

+4

为什么使用'ORDER BY f.field_value + 0'?它是一个'ENUM'列吗? –

回答

0

我们必须注意与LEFT JOIN查询。这种JOIN必须使用右表indexed。你检查了你的indexes ??

如果它们没问题,并且表格中的行数过多,那么即使它尽可能最优化,它也可能会导致您查询的问题。

1

只要您执行任何类型的ORDER BY操作并使用函数/数学(+0)修改值,您将强制MySQL对结果集中的每个字段进行转换,你得到temporary

你可以发布你的表的结构,以便我们可以看到你有什么索引和字段类型?

0

1)为以下字段创建索引: jos_users.id jos_js_res_record_values.record_id jos_js_res_record_values.field_type jos_js_res_record_values.field_label jos_js_res_record.section_id fieldsdata jos_js_res_record.title

2.) 这应该从连接中取出并放在其中:

f.field_type = 'digits' 
AND f.field_label = 'Price' 

3.)其中A和B: 如果A不太可能(在表中很少见),并且它的计算速度比B快,那么这是一个好的顺序。否则,当B和A比,其中A和B 同样是真实的或更快,但最好是对左侧的操作数更概率,因为这些公式的:

False and B = False 
True or B = True 

在上述公式适用的情况B完全没有计算,你赢得了很多时间。所以,如果你耐心地用更多的价值类型来测试你的操作数,你可以得到理想的订单。

4)取而代之的是:

ORDER BY f.field_value + 0 desc, f.field_value desc 

你需要这个:

ORDER BY f.field_value desc, f.field_value desc 

如果前者不受任何强迫。

我希望这会有所帮助。