Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL连接检查每一行_Mysql_Join - Fatal编程技术网

MySQL连接检查每一行

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

在我的网站上执行此查询需要很长时间。我在我的网站上有一个博客和一个论坛,我将它们松散地集成在一起,因此每个论坛帐户在博客上都有一个帐户,反之亦然。但是,每个表中的用户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表中的每一行,以得出超过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(),这会使查询花费很长时间。将两者更改为相同的字符集修复了该问题。