Mysql 内部连接工作太慢-只需在phpmyadmin中显示加载标签

Mysql 内部连接工作太慢-只需在phpmyadmin中显示加载标签,mysql,query-optimization,inner-join,Mysql,Query Optimization,Inner Join,我有3个表,每个表有将近70000个数据 当我执行select查询时,我在其中添加了一个内部联接,比它工作得更快 跟踪速度更快 select A.id from product as A inner join product_cat as B on A.id=B.mapped_id 或 对于一个内部联接,它工作得更快 但是,当我在同一个select查询中添加两个内部联接时,它的工作速度太慢了。它不显示数据,只在phpmyadmin中显示加载标签 select A.id from prod

我有3个表,每个表有将近70000个数据 当我执行select查询时,我在其中添加了一个内部联接,比它工作得更快

跟踪速度更快

select A.id from product as A 
inner join product_cat as B on A.id=B.mapped_id 

对于一个内部联接,它工作得更快

但是,当我在同一个select查询中添加两个内部联接时,它的工作速度太慢了。它不显示数据,只在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
我的目的只是找出数据库中有多少记录。 也尝试使用计数功能,但花费的时间太多

任何帮助都将不胜感激,
谢谢,

也许您的查询试图返回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 BYclase进行分组,但我认为更好的解决方案是根据您的目标重新设计查询

如果您想使用组,您的查询将如下所示

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

使用EXPLAIN分析查询的性能,并确定任何缺少的索引。


如果您想得到具体建议,请将您的实际查询、EXPLAIN打印的执行计划以及所有相关表格的CREATE TABLE语句添加到您的问题中。

快速问题我想我知道答案:您的第三个代码部分错了,对吗?您将product_cat as B做了两次,并且任何时候都不包括product_sup!当数据库查询运行缓慢时,请对查询进行解释,并查看表上的索引以及实际使用的索引。。。。在这里发布这些信息也有助于人们回答您的问题嗨,谢谢您的回复,实际上我在问题中打印了错误的查询对不起,我实际上执行了您提到的上述查询,从产品中选择A.id作为内部联接产品\u cat作为B在A.id=B.mapped\u id内部联接产品\u sup作为C在A.id=C.mapped\u id你能解释一下我如何使用分组依据吗请,我用分组依据更新了答案。尽管如此,我认为您应该遵循@Naktibalda的建议来优化您的查询。谢谢,因为我不能在有两个连接的查询上使用Explain,因此,我对一个内部联接单独使用Explain,当我从phpmyadmin中单击表B或C的映射_id的索引链接时,它显示了索引表B和C的映射_id的建议。它也只是加载了更长的时间,之后我停止了进程,还有其他的索引方法吗?当然,您可以对具有多个联接的查询使用EXPLAIN,只需在选择和运行它之前放置EXPLAIN。不要将phpmyadmin用于长时间运行的任务,请使用命令行mysql客户端、mysql工作台或其他GUI工具,而不是web工具。必须运行的语句是在product_catmapped_id上创建索引映射的_id;为了执行解释,您应该在查询中添加限制。如果结果太多,你就看不到解释
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