内部连接工作太慢 - 只在 phpmyadmin 中显示加载标签
Posted
技术标签:
【中文标题】内部连接工作太慢 - 只在 phpmyadmin 中显示加载标签【英文标题】:Inner join works Too Slower - just show loading label in phpmyadmin 【发布时间】:2014-08-11 07:48:01 【问题描述】:我有 3 个表,每个表都有近 70,000 个数据 当我执行选择查询时,我添加了一个内部联接,它的工作速度比它更快。
以下工作更快
select A.id from product as A
inner join product_cat as B on A.id=B.mapped_id
或
select A.id from product as A
inner join product_sup as C on A.id = C.mapped_id
(一个内连接会更快)
但是当我在同一个选择查询中添加两个内部联接时,它的工作速度太慢了(不显示数据它只是在 phpmyadmin 中显示加载标签)
select A.id
from product as A
inner join product_cat as B
on A.id = B.mapped_id
inner join product_sup as C
on A.id = C.mapped_id
我的目的只是找出数据库中有多少记录。 也尝试过使用计数功能,但需要太多时间。
任何帮助将不胜感激, 谢谢,
【问题讨论】:
快速问题(我想我知道答案):您的第三个代码部分是错误的,对吧?您将 product_cat 作为 B 两次,并且不包括 product_sup 任何时候! 当数据库查询运行缓慢时,请对查询执行 EXPLAIN,并查看表上的索引,以及实际使用的索引......在此处发布这些信息也有助于人们回答你的问题 【参考方案1】:使用 EXPLAIN 分析查询性能并识别任何缺失的索引。http://dev.mysql.com/doc/refman/5.5/en/using-explain.html http://dev.mysql.com/doc/refman/5.5/en/explain-output.html
如果您想获得具体建议,请将您的实际查询、由 EXPLAIN 打印的执行计划和所有相关表的 CREATE TABLE 语句添加到您的问题中。
【讨论】:
谢谢,因为我不能在有两个连接的查询上使用解释,所以我单独使用解释(对于一个内部连接),当我点击时,它会显示对表 B 和 C 的索引 mapped_id 的建议在来自phpmyadmin的mapped_id(表B或C)的索引链接上,它也只是加载了更长的时间,之后我停止了进程那么,还有其他索引方式吗? 当然你可以在一个有多个连接的查询上使用 EXPLAIN,只要把 EXPLAIN 放在 SELECT 之前并运行它。 不要使用 phpmyadmin 执行长时间运行的任务,使用命令行 mysql 客户端、Mysql Workbench 或其他一些 GUI 工具而不是 Web 工具。您必须运行的语句是 CREATE INDEX mapped_id ON product_cat(mapped_id); 您应该在查询中添加LIMIT
以执行EXPLAIN
。如果结果太多你看不到“解释”【参考方案2】:
也许您的查询试图返回超过 100 万条结果,这就是速度缓慢的原因。也许您正在表B
和C
之间进行笛卡尔积。
让我们举个例子。
Table (A) = (id=1)
Table (B) = (id=1,mapped_id=1),(id=2,mapped_id=1),
(id=3,mapped_id=1),(id=4,mapped_id=1)
Table (C) = (id=1,mapped_id=1),(id=2,mapped_id=1), (id=3,mapped_id=1)
如果我们对这些数据进行查询,它将返回 12 行,所有行都带有 A.id=1
要解决该问题,您可以尝试在SELECT
子句上使用DISTINCT
或使用GROUP BY
clase 进行分组,但我认为更好的解决方案是根据您的目标重新设计查询。
如果你想通过你的查询来使用组将是这样的
select A.id from product as A
inner join product_cat as B on A.id = B.mapped_id
inner join product_sup as C on A.id = C.mapped_id
group by A.id
【讨论】:
嗨,感谢您的回复,实际上我在我的问题中打印了错误的查询对不起,我实际上执行了您提到的上述查询,从产品中选择 A.id 作为 A 内部连接 product_cat 作为 A 上的 B .id = B.mapped_id inner join product_sup as C on A.id = C.mapped_id 你能解释一下我如何使用group by吗, 我用 group by 更新了答案。尽管如此,我认为您应该遵循@Naktibalda 的建议来优化您的查询。以上是关于内部连接工作太慢 - 只在 phpmyadmin 中显示加载标签的主要内容,如果未能解决你的问题,请参考以下文章
phpmyadmin 错误,无法连接:xampp 中的设置无效
从 php 文件到 phpmyadmin 的数据库连接失败?
Intellij Idea Mongo 连接速度太慢且功能不足