2010-11-29 55 views
2
我有两个表

,我需要选择一些数据来自他们MySQL的 - 选择+加盟+ ORDER BY性能

SELECT f.* 
FROM file_data f 
JOIN subscriptions s ON f.uid = s.elementid 
WHERE s.uid = 119762 AND f.private=0 
ORDER BY f.date DESC 

的加盟现在,即使是一小部分数据的查询接管一秒。 这是由于ORDER BY f.date引起的“订阅”上使用的'filesort'和'temporary'(删除该条件导致时间降至0.01s以下)

有谁能告诉我如何加速查询?

这里的EXPLAIN

id select_type table type possible_keys key   key_len ref   rows Extra 
1 SIMPLE   s  ref uid_elementid uid_elementid 4  const   171 Using index; Using temporary; Using filesort 
1 SIMPLE   f  ref uid_uname  uid_uname  5  s.elementid 22 Using where 

回答

1

你应该穿上f.date

+0

已经有上file_data.date指数,我不知道为什么没有列为可能的密钥... – migajek 2010-11-29 16:03:36

1

指数当指数将有助于一个ORDER BY是不平凡的预测结果。它很少像“索引order by中的字段”那么简单。 This link具有细节的细节。如果您认为自己有适当的索引,并且优化器不会决定使用它们,请使用index hint向数据库服务器建议索引。

0

我遇到了同样的问题,这是我的解决方案:

SELECT f.* 
FROM (SELECT * FROM file_data WHERE `private`=0 ORDER BY `date` DESC) f 
JOIN subscriptions s ON f.uid = s.elementid 
WHERE s.uid = 119762