我有这个查询,我执行了很多次。你能建议如何优化这个吗?索引已经应用于表格。
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 :(得分:1)
network.frd_id
,network.mem_id
和bulletin.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;
将记录分组到可能聚合或筛选在一起的块中会大大改善。