跨越多个表时,MYSQL SELECT很慢

时间:2017-01-25 08:42:28

标签: mysql select

我有一个mysql查询,它返回需要跨越多个表的唯一1条记录。但是,执行时mysql查询很慢。

查询:

SELECT *, 
(SELECT TreeName FROM sys_tree WHERE TreeId = Mktg_Unit_Booking.ProjectLevelId) AS PhaseName, 
(CASE WHEN ProductType = 'U' THEN (SELECT UnitNo FROM prop_unit pu WHERE pu.UnitId = mktg_unit_booking.UnitId) 
ELSE (SELECT BayNo FROM prop_car_park pcp WHERE pcp.CarParkId = UnitId) END) AS UnitNo, 
(SELECT CustomerName FROM mktg_customer mc WHERE mc.CustomerId = mktg_unit_booking.CustomerId) AS CustomerName 
FROM Mktg_Unit_Booking 
WHERE IsDeleted <> '1' AND IsApproved = '1' 
AND UnitId = 1110 AND ProductType = 'U' 
ORDER BY UnitNo

我在查询中运行了EXPLAIN,我得到了这个:

EXPLAIN TABLE

关于如何提高查询速度的任何其他建议? 谢谢!

2 个答案:

答案 0 :(得分:0)

你正在做跨产品,而不是你应该使用加入。

答案 1 :(得分:0)

不要在select语句中使用子查询,而是在from语句后使用Mktg_Unit_Booking上的正确连接。

你的查询应该是这样的:

select 
sys_tree.TreeName AS PhaseName,
case  
    WHEN Mktg_Unit_Booking.ProductType = 'U' then prop_unit.UnitNo
    else prop_car_park.BayNo
end as UnitNo,
mktg_customer.CustomerName AS CustomerName 
FROM Mktg_Unit_Booking 
left join sys_tree on sys_tree.TreeId = Mktg_Unit_Booking.ProjectLevelId
left join prop_unit on prop_unit.UnitId = Mktg_Unit_Booking.UnitId
left join prop_car_park on prop_car_park.CarParkId = Mktg_Unit_Booking.UnitId
left join mktg_customer on mktg_customer.CustomerId = Mktg_Unit_Booking.CustomerId
WHERE IsDeleted <> '1' AND IsApproved = '1' 
AND UnitId = 1110 AND ProductType = 'U' 
ORDER BY UnitNo;

我假设每个表只包含一个匹配的元组。如果还有更多,那么您的逻辑需要修改。