我网站上的此查询需要很长时间才能执行。我在我的网站上有一个博客和论坛,我已经松散地集成了,所以每个论坛帐户都有一个帐户在博客上,反之亦然。但是,每个表中的user_id都不相关,所以我一直按用户名加入它们。
SELECT *
FROM comments AS c
INNER JOIN articles AS a ON c.article_id = a.article_id
INNER JOIN user_profiles AS p ON c.user_id = p.user_id
INNER JOIN blog_users AS b ON c.user_id = b.user_id
INNER JOIN forum_users AS f ON b.username = f.username
WHERE a.article_id = :article_id
ORDER BY c.comment_id DESC
LIMIT 0 , 30
当我在查询中使用explain时,我看到最后一个连接正在检查forum_users表中的每一行,以得出超过1,000,000行的结果。两个表的用户名列都被编入索引,所有表都是InnoDB。作为一种解决方法,我将每个用户的论坛user_id存储在blog_users表中,反之亦然,这样我就可以直接加入user_id,它可以更快地运行查询,但我希望尽可能避免这样做。有没有办法可以重新编写查询,以便用户名加入更有效?
答案 0 :(得分:2)
表和列字符集是否相同?例如,utf8中的blog_users和latin1中的forum_users?如果它们不相同,mysql将不会使用索引。您可以使用例如:
更改字符集 ALTER TABLE blog_users CONVERT TO CHARACTER SET utf8
如果这是问题,请在执行此操作之前仔细阅读文档。它可以更改列的内容。 http://dev.mysql.com/doc/refman/5.1/en/alter-table.html
答案 1 :(得分:0)
两件事......你的评论表是否有文章ID的索引...如果没有,请获取一个......其次,你的where子句指的是查询的JOINED表而不是主表中的你的SELECT FROM ...因为他们都有文章ID的列,我会把你的where子句改为
WHERE c.Article_ID = :article_ID
此外,请确保
上的索引user_ID上的user_profiles索引
User_ID上的blog_users索引
forum_users用户名索引