MySQL连接检查每一行
在我的网站上执行此查询需要很长时间。我在我的网站上有一个博客和一个论坛,我将它们松散地集成在一起,因此每个论坛帐户在博客上都有一个帐户,反之亦然。但是,每个表中的用户id不相关,因此我一直通过用户名加入它们MySQL连接检查每一行,mysql,join,Mysql,Join,在我的网站上执行此查询需要很长时间。我在我的网站上有一个博客和一个论坛,我将它们松散地集成在一起,因此每个论坛帐户在博客上都有一个帐户,反之亦然。但是,每个表中的用户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 J
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表中的每一行,以得出超过1000000行的结果。这两个表的用户名列都被索引,所有表都是InnoDB。作为一种解决方法,我将每个用户的论坛用户id存储在blog\u users表中,反之亦然,这样我就可以直接在用户id上加入,该id使查询运行得更快,但如果可能的话,我希望避免这样做。有没有办法重新编写查询,以便用户名联接更有效?表和列字符集是否相同?例如,utf8中的博客用户和latin1中的论坛用户?如果它们不相同,mysql将不使用索引。您可以使用更改字符集,例如:
altertableblog\u用户转换为字符集utf8
如果这是问题所在,请在执行此操作之前仔细阅读文档。它可以更改列的内容 有两件事。。。您的评论表是否有关于文章ID的索引。。。如果没有,就买一个。。。其次,where子句引用的是查询的联接表,而不是SELECT FROM中的主表。。。因为它们都有文章ID的列,所以我将您的where子句更改为
WHERE c.Article_ID = :article_ID
此外,确保索引在
用户ID上的用户配置文件索引
用户ID上的博客用户索引
论坛用户用户名索引你能对该查询运行
解释扩展
并发布输出吗?你完全正确。MySQL在每个查询的5000000行表上运行CONVERT(),这会使查询花费很长时间。将两者更改为相同的字符集修复了该问题。