2012-12-23 328 views
2

以下是我的查詢以從各種表中獲取信息。Mysql查詢需要很長時間才能執行

我正在使用mysql數據庫。

$sql="select c.cid,c.id,c.compid, c.firstname,c.lastname,c.phone,c.home_phone,c.payment,c.status,c.pstatus, c.pstatus2, c.reservation, u.triptype,u.flight_type_arr, u.flight_type_dep, c.email,c.sugg_pickup_date_time,c.sugg_airport_pickup_time,u.triptype,u.traveltype,    
      dr_arr.driver_name as driver_name_arr, dr_arr.driver_email as driver_email_arr, 
      dr_dep.driver_name as driver_name_dep, dr_dep.driver_email as driver_email_dep, 
      ar.rid,ar.finalprice1, ar.finalprice2, ap.p1, ap.p2, ap.p3, ap.transaction_id 
      from customer c 
      left join vehicle_fees vf1 on (vf1.vehicle_id=c.vehicle_id1) 
      left join vehicle_fees vf2 on (vf2.vehicle_id=c.vehicle_id2) 
      left join userinfo u on (u.id=c.id) 
      left join holiday_fees hf1 on (hf1.holidayfee_Date=u.date) 
      left join holiday_fees hf2 on (hf2.holidayfee_Date=u.date1) 
      left join airport_reservation ar on (ar.cid = c.cid) 
      left join driver dr_arr on (dr_arr.did = ar.did_arr) 
      left join driver dr_dep on (dr_dep.did = ar.did_dep) 
      left join airport_payment ap on (ap.cid = c.cid) 
      where (c.reservation = 'booked' or c.reservation = 'cancelled') ORDER BY c.cid DESC" .$var_limit; 

但它需要更多時間來執行。

有人可以建議我的查詢是否錯誤或正確?

+2

向我們展示'explain select'輸出。 –

+0

讓這個查詢變慢是非常正常的!它使用10個連接..我相信一些(所有?!)表沒有索引。爲了更好地幫助你,你應該給我們表格結構和聲明索引。 – Yousf

回答

0

該查詢看起來合法,我看到的問題是它沒有限制。通常,您應該在查詢腳本末尾放置一個LIMIT語句,以限制您想要獲取的行數。我想知道有多少記錄。

+0

不,您不能在沒有更多信息的情況下說「查詢看起來合法」。僅僅因爲它沒有語法錯誤並不能使其合法。而「LIMIT」不會奇蹟般地解決問題。 – fancyPants

+0

那麼這個傢伙,沒有得到任何錯誤,它只是加載緩慢,這意味着他有優化問題,如太多的數據 –

+0

是的,他**是**要求**優化**,並且只是放一個'LIMIT'並不是真正的優化。所以你的觀點實際上是無用的。 – fancyPants

1

當你這樣做時 - 一張主表(客戶)正在加入到所有其他「可選」表中,有時我發現MySQL試圖爲你思考並在內部重構IT認爲的主要表。通過使用已知的特殊關鍵字MIGHT可以幫助..

from: 
    SELECT (rest of query) 
to: 
    SELECT STRAIGHT_JOIN (rest of query) 

現在,爲您的where子句和order by。確保你有一個索引(保留,cid)

相關問題