我正在开发一个应用程序(使用CodeIgniter),需要使用相当复杂的查询检索行程。下面是它的一个例子:MySQL连接在复杂查询中丢失
SELECT *, CONCAT(`u1`.`city`,', ', `u1`.`country_id`) as `from_city`,
CONCAT(`u2`.`city`,', ', `u2`.`country_id`) as `to_city`
FROM trips
LEFT JOIN `cities` as `u1` ON (`u1`.`id`=`from_city`)
LEFT JOIN `cities` as `u2` ON (`u2`.`id`=`to_city`)
WHERE trip_id
IN (SELECT trip_id
FROM stops
WHERE city_id = 7583
AND trip_id
IN (SELECT trip_id
FROM stops
WHERE trip_id
IN (SELECT trip_id
FROM stops
WHERE city_id=7565)))
ORDER BY departure_date;
它曾经工作得很好,直到今天。它涉及3个表格(旅行,停靠和城市)。自开始测试以来,出行和停靠表格的增长并不是很大,可能从200到300条记录。
如果我在CodeIgniter应用程序中测试,我得到一个2006年或2013年'失去连接到MySQL服务器...'错误。如果我使用NaviCat进行查询,则会得到与“在查询期间丢失与MySQL服务器的连接”消息。
为了更好地说明什么,我想在这里完成的是表什么样子:
旅行(未显示所有列)
停止
城市(并非所有列都显示)
基本上货轮插入行程并详细说明它们的停靠位置,然后代理商会在可用行程中搜索。因此,如果货机发布行程为A-> B-> C-> D-> E,则另一货机发布行程为K-> H-> E-> D-> C,当代理商寻找C-> E。 stop表中的'ordinal'列是我后来筛选错误方向的行程的方式。
什么可以延长响应时间呢?我如何重写这个查询来使它更快?
最有可能这个查询超时......为什么在这个世界上你在做一个三重嵌套'in'子句?!这是**可怕的**效率低下。 – mituw16
在WHERE中嵌套的3个级别可能会导致性能下降。请发布'travelling,cities'表中的行样本,以及预期的查询输出结果的样本。 –
尽可能地尝试加入。嵌套的'IN'子查询是非常低效的。进行匹配时,IN子查询将在每一行上运行。 – khuderm