MySQL在条件下离开了连接查询 - 超时

时间:2013-12-13 14:38:40

标签: php mysql phpmyadmin left-join

我有2种表格类型,1)属性2)预订日期。

下面的查询应该是在可用性表中选择没有相关预订日期的属性。

SELECT prop.*, ( 3959 * acos( cos( radians(50.2375800) ) * cos( radians(prop.latitude) ) * cos( radians(prop.longitude ) - radians(-3.7697910) ) + sin( radians(50.2375800) ) * sin( radians(prop.latitude)))) AS dstnc 
FROM (SELECT * FROM `props_01` UNION ALL SELECT * FROM `props_03`) AS prop 
LEFT JOIN `availability` AS avail ON prop.unique_code=avail.ucode AND (avail.date != '20131228' AND avail.date != '20131229' AND avail.date != '20131230') 
WHERE `status`='on' AND avail.ucode IS NULL AND prop.country!='Wales' 
GROUP BY `unique_code` 
HAVING dstnc <= 2 
ORDER BY prop.sleeps ASC, prop.package ASC

props_XX表包含属性数据,而availability表包含3列(唯一ID /属性代码“ucode”/预订日期“date”),这些表引用每个属性一个独特的10个字符代码。

即使我只使用一个属性表执行查询,它仍然超时

当我不包含查询的可用性部分时,它运行正常,但是在可用性日期,查询似乎陷入循环并最终超时。

有人可以帮助解决方案,谢谢。

2 个答案:

答案 0 :(得分:1)

您不提供有关表格大小或结果结果集大小的信息。我认为,从名称来看,prop.unique_code实际上是唯一的。

这是格式化的查询,因此我可以更好地阅读:

SELECT prop.*, . . . 
FROM (SELECT * FROM `props_01` UNION ALL SELECT * FROM `props_03`
     ) AS prop LEFT JOIN
     `availability` AS avail
     ON prop.unique_code = avail.ucode AND
        (avail.date not in ('20131228', '20131229', '20131230') 
WHERE `status` = 'on' AND avail.ucode IS NULL AND prop.country != 'Wales' 
GROUP BY `unique_code` 
HAVING dstnc <= 2 
ORDER BY prop.sleeps ASC, prop.package ASC;

第一个建议是availability(ucode)availability(date, ucode)上的索引。这很可能会解决性能问题。

答案 1 :(得分:0)

您按prop.unique_code = avail.ucode进行加入 但后来被avail.ucode IS NULL过滤,所以这没有多大意义。

所以prop.unique_code也必须NULL