我有这个MySQL查询似乎非常慢。运行需要3秒钟。这是试图从他们关注的人或他们拥有的任何兴趣中获取所有帖子。它还试图确保它不会显示任何匹配任何post_id的重复共享。你们觉得我应该做些什么?
SELECT p.*,
IFNULL(post_data_share, UUID()) AS unq_share,
UNIX_TIMESTAMP(p.post_time) AS a
FROM posts p
LEFT JOIN users_interests i ON (i.user_id=1
AND p.post_interest = i.interest)
LEFT JOIN following f ON (f.user_id=1
AND p.post_user_id = f.follower_id)
WHERE (post_user_id=1
OR f.follower_id IS NOT NULL
OR i.interest IS NOT NULL)
AND (POST_DATA_SHARE NOT IN
(SELECT POST_ID
FROM posts p
LEFT JOIN following f ON f.user_id=1
AND p.post_user_id = f.follower_id
LEFT JOIN users_interests i ON (i.user_id=1
AND p.post_interest = i.interest)
WHERE (post_user_id=1
OR f.follower_id IS NOT NULL
OR i.interest IS NOT NULL))
OR POST_DATA_SHARE IS NULL)
GROUP BY unq_share
ORDER BY `post_id` DESC LIMIT 10;
答案 0 :(得分:2)
更多参考此答案Best my.cnf configuration for a 8GB MySQL server with MyISAM use only
答案 1 :(得分:1)
我首先看一下查询的执行计划。以下是EXPLAIN关键字上MySQL文档的链接,向您展示优化程序如何构建查询:http://dev.mysql.com/doc/refman/5.5/en/using-explain.html
如果CPU使用率很低,可能是瓶颈是大型表扫描的磁盘访问。
执行查询的方式通常与编写方式不同。一旦了解了执行计划的结构,您可能会在最大的连接上创建索引。每个表都应该有一个聚簇索引(通常是默认创建的),但其他字段通常可以从非聚簇索引中受益。
如果问题非常严重并且这对您的应用程序至关重要,您可能需要考虑重新组织数据库。