Php 四个表上的MySQL选择/连接导致超时

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

我需要选择4张桌子。组合表ships和表ship_历史没有问题,我可以立即得到结果。我尝试了普通的select和LEFT连接,两者都是即时的。当我尝试左加入第三个表时,需要很长时间(大部分时间都会发生超时)。我甚至想加入第四张桌子

所有四个表都与表ships的ID连接。对于表ship_构造,我只需要列final等于1的记录。这是我对3个表的当前查询:

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现在我需要弄清楚如何加入第四个表:-)