MySQL加入检查每一行

时间:2011-10-22 20:48:22

标签: mysql join

我网站上的此查询需要很长时间才能执行。我在我的网站上有一个博客和论坛,我已经松散地集成了,所以每个论坛帐户都有一个帐户在博客上,反之亦然。但是,每个表中的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,它可以更快地运行查询,但我希望尽可能避免这样做。有没有办法可以重新编写查询,以便用户名加入更有效?

2 个答案:

答案 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用户名索引