2011-04-18 58 views
0

我當前的查詢是這個樣子:如何優化查詢

SELECT distinct pg.id,pg.email,pg.theme,op.PaymentMode,od.DeliveryMode,uv1.value AS FirstName, uv2.value AS LastName, uv3.value AS Mobile, uv4.value AS City, uv5.value AS State, uv6.value AS Address 
FROM userdb.user u,userdb.paymentgatewaytracker pg, 
oms.deliverymode od,oms.paymentmode op, 
userdb.uservar uv1 
JOIN userdb.uservar uv2 ON uv1.user_id = uv2.user_id 
AND uv2.name = 'billingLastName' 
LEFT JOIN userdb.uservar uv3 ON uv1.user_id = uv3.user_id 
AND uv3.name = 'billingMobile' 
JOIN userdb.uservar uv4 ON uv1.user_id = uv4.user_id 
AND uv4.name = 'billingCity' 
JOIN userdb.uservar uv5 ON uv1.user_id = uv5.user_id 
AND uv5.name = 'billingState' 
JOIN userdb.uservar uv6 ON uv1.user_id = uv6.user_id 
AND uv6.name = 'billingAddress' 
where uv1.name = 'billingFirstName' 
AND u.id = uv1.user_id 
AND u.email=pg.email 
and op.PaymentModeId=pg.paymethod 
and od.DeliveryModeId=pg.deliveryOption 
ORDER BY pg.id 

這是給我正確的結果,而我檢查我的本地主機。但我想在我的瀏覽器中顯示。而我正在嘗試這樣做時,它顯示致命錯誤:超過30秒的最大執行時間。但對於小型查詢,我正在瀏覽器中獲取結果。任何人都可以優化我上面給出的查詢。

+0

您是否索引了所有適當的列? – 2011-04-18 09:13:02

+0

請顯示你的解釋結果,tkx – Neo 2011-04-18 09:16:19

回答

0

你可以把一個索引上的標識和名稱的列userdb.uservar因爲大多數的連接是這些

+0

你能否給我寫一個優化查詢。 – pritosh 2011-04-18 09:16:45

0

Indexes如果尚未使用的可能是很大的幫助在這裏。

1

您加入user_id並重複名稱。你可能會缺少一個適當的索引

CREATE INDEX uservar_user_id_name ON uservar (user_id, name); 

但是,如果你創建一個表中的列的user_id,billingLastName,billingMobile,結算城市,billingState,billingAddress和billingFirstName而不是單獨的有他們,你會得到更好的性能uservar表中的行。

0

你需要一個指數的「USERVAR」(USER_ID,名)

你似乎是在做一個潛在的大CROSSJOIN可能慢下來不少。 「userdb.user U,userdb.paymentgatewaytracker PG, oms.deliverymode OD,oms.paymentmode OP」

我建議你張貼 「解釋選擇...」 的加入。