簡體   English   中英

優化mySQL左聯接

[英]Optimizing mySQL LEFT JOIN

我有一個行程表,其中完成的行程在trips.txnPNR中具有交易ID。

我有一個引用trips.id的driver_contacts表。

我必須找出是否有旅行設置了trips.txnPNR,但沒有由driver_contacts.trip中具有該ID的行表示。

我可以通過此JOIN成功定位這些行程,但是顯然這非常占用內存。

SELECT
 trips.id,
 driver_contacts.trip
FROM trips
LEFT JOIN driver_contacts ON trips.id = driver_contacts.trip WHERE trips.`tripDropoff` > '2014-10-24 15:15:25'
AND driver_contacts.trip IS NULL
AND TRIM(trips.txnPNR) != ''

我的同事建議將更改速度更快

SELECT
 24hourTrips.id,
 driver_contacts_null.trip
FROM (SELECT id,txnPNR FROM trips WHERE trips.`tripDropoff` > now() - INTERVAL 1 DAY AND
TRIM(txnPNR) != '') AS 24hourTrips
LEFT JOIN (SELECT * FROM driver_contacts where driver_contacts.trip IS NULL) AS driver_contacts_null ON 24hourTrips.id = driver_contacts_null.trip

但是該查詢將獲取所有行程,無論它們在driver_contacts中是否有一行。

對於ID不位於driver_contacts.trip中的所有行程行,查找起來會不會花費很多精力?

找到了解決方案! 一秒鍾之內返回,每個人都很高興。

SELECT
24hourTrips.id,
driver_contacts.trip
FROM (SELECT id,txnPNR FROM trips WHERE trips.`tripDropoff` > now() - INTERVAL 1 DAY AND
TRIM(txnPNR) != '') AS 24hourTrips
LEFT OUTER JOIN driver_contacts ON 24hourTrips.id = driver_contacts.trip WHERE driver_contacts.trip IS NULL AND TRIM(24hourTrips.txnPNR) != ''

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM