Php 四个表上的MySQL选择/连接导致超时
我需要选择4张桌子。组合表ships和表ship_历史没有问题,我可以立即得到结果。我尝试了普通的select和LEFT连接,两者都是即时的。当我尝试左加入第三个表时,需要很长时间(大部分时间都会发生超时)。我甚至想加入第四张桌子 所有四个表都与表ships的ID连接。对于表ship_构造,我只需要列final等于1的记录。这是我对3个表的当前查询:Php 四个表上的MySQL选择/连接导致超时,php,mysql,join,left-join,Php,Mysql,Join,Left Join,我需要选择4张桌子。组合表ships和表ship_历史没有问题,我可以立即得到结果。我尝试了普通的select和LEFT连接,两者都是即时的。当我尝试左加入第三个表时,需要很长时间(大部分时间都会发生超时)。我甚至想加入第四张桌子 所有四个表都与表ships的ID连接。对于表ship_构造,我只需要列final等于1的记录。这是我对3个表的当前查询: SELECT s.id , s.name , s.year , s.built , sh.col_1
SELECT s.id
, s.name
, s.year
, s.built
, sh.col_1
, sh.col_2
, sh.col_3
, sc.col_1
, sc.col_2
, sc.final
FROM ships s
LEFT
JOIN ship_history sh
ON sh.ship_id = s.id
LEFT
JOIN ship_construction sc
ON sc.ship_id = s.id
AND sc.final = 1
对于ships表中的每个记录,ship_history表中都有一条记录。对于表3和表4,对于每个表1记录,这可以是零或更多。我使用了左联接,因为我需要表1中的所有记录
表ships目前有17128条记录
表ship_history当前有17128条记录
表ship_construction目前有41935条记录
表4目前有57988条记录
当然,我已经阅读了大量的Stackoverflow主题,并在Google上进行了搜索。我尝试过许多不同的方法,但我认为我走错了方向。我也读过索引,但这对我来说是新的,所以我不确定在这种情况下是否有必要
谁能把我推向正确的方向?任何帮助都是感激的,如果需要更多的信息,请告诉我
仅用于记录:我当前的查询确实有效,但耗时太长。
谢谢您添加了正确的索引了吗?尝试在ships.id(如果不是主键)和(
ship\u-construction
ship\u-id
+ship\u-construction
final
)上添加索引。。使用BTREE更改表ship\u construction
添加索引idx\u ships\u construct
(ship\u id
,final
);我认为你在索引方面的方向是正确的。索引应该可以帮助你更快地完成这项工作,阅读更多关于它的信息,谢谢你们@Firewizz:我添加了你的索引,我的查询现在可以立即得到结果了!有什么不同:D现在我需要弄清楚如何加入第四个表:-)