2012-07-27 75 views
0

我有这个查询,我执行了很多次。你能建议如何优化这个?索引已经应用于表格。如何优化此查询以更快地获得结果?

SELECT 
    DISTINCT b.appearance_id, 
    b.photo_album_id, 
    b.eventcmmnt_id, 
    b.id, 
    b.mem_id, 
    b.subj, 
    b.body, 
    b.date, 
    b.parentid, 
    b.from_id, 
    b.visible_to, 
    b.image_link, 
    b.post_via, 
    b.youtubeLink, 
    b.link_image, 
    b.link_url, 
    b.auto_genrate_text 
FROM 
    bulletin b 
INNER JOIN 
    network n 
ON 
    (n.mem_id = b.mem_id) 
WHERE 
    b.parentid = '0' AND 
    '$userid' IN (n.frd_id, b.mem_id)) 
GROUP BY 
    b.id 
ORDER BY 
    b.date DESC 
LIMIT 
    0,20 
+0

出发点:https://dev.mysql.com/doc/refman/5.0/en/using-explain.html – VolkerK 2012-07-27 07:35:28

+0

GROUP BY b.id正是为了什么?你似乎没有使用任何聚合。 “分组依据”可能很昂贵。从中得到帮助:确保你索引你加入的所有列。 – 2012-07-27 07:35:40

+0

也许增加查询缓存大小? – 2012-07-27 07:36:26

回答

1

正在network.frd_idnetwork.mem_idbulletin.mem_id所有索引?如果它们不是,那么如果表格中有大量的话,你将会陷入混乱。

另外,and ('$userid' IN (n.frd_id, b.mem_id))在成本方面是可怕的。如果可能的话,你应该始终坚持=,!=等。是否可以用and ('$userid' = n.frd_id or '$userid = b.mem_id)替换这条线?

最后,如果您在记录方面查看一些严重的卷,重新排序表可能是一个重大胜利。我在工作中运行一些数据库,其中包含大量由关键值标识的数据。通常情况下,我想将这些值汇总到某个级别。我发现偶尔运行alter table someTableName order by col1, col2;将记录归入可能汇总或筛选出来的数据块中可以大大改善。

+0

不,它们已被索引 – user1551419 2012-07-27 07:34:36

+0

@ user1551419添加了另一个关于重新排序表的部分。 – Fluffeh 2012-07-27 07:42:04

+0

感谢您的回复... – user1551419 2012-07-27 08:13:27