2015-09-04 67 views
0

我正在開發一個可以連接兩個表的sql查詢並返回一些結果。
我有第一個表中的2個表我保存我的訂單,並在另一個表中保存我喜歡的信息。
我想從訂單表顯示給用戶圖片,用戶還不喜歡圖片。我用這個查詢減少左連接查詢執行時間

SELECT amg_order.* 
    FROM amg_order 
    LEFT OUTER JOIN amg_like ON amg_like.order_id=amg_order.order_id 
     AND amg_like.user_id=:user_id 
WHERE amg_order.status = '1' 
    AND amg_order.user_id != :user_id 
    AND (amg_like.user_id != :user_id || amg_like.user_id is null) 
ORDER BY amg_order.likeType DESC, RAND() 

該查詢返回正確的結果,但是當類似的信息超過15000的時間來執行這個語句已經6秒。
有沒有人有任何想法來減少這個時間?
對不起,我的英語太糟糕了:)

+0

'ORDER BY .... RAND()'是殺你的表現,很可能。 「蘭德()」是頭號罪魁禍首。 – Andrew

+0

而不是僅僅使用列名稱而不是*而是使用<= .if。如果需要使用以其他方式排序,那麼更快地檢索數據並使用RAND()? – mohan111

+0

@Andrew是的,我同意你 – mohan111

回答

1

你可以試試下面的查詢。這當然會減少一些執行時間。您可以在選擇語句中指定字段名稱而不是*號。

這裏更新查詢:

SELECT amg_order.* FROM amg_order 
LEFT JOIN amg_like ON amg_order.order_id = amg_like.order_id 
WHERE amg_order.status= '1' AND amg_order.user_id != :user_id AND (amg_like.user_id != :user_id || amg_like.user_id is null) 
ORDER BY amg_order.likeType DESC LIMIT 10; 
+0

我在查詢的末尾添加了限制1,但執行時間爲5.5 – Armin

+0

您是否嘗試過我的查詢版本?下一步將爲您的表amg_order和amg_like添加適當的索引。 –

+0

ALTER TABLE amg_order ADD INDEX(user_id); ALTER TABLE amg_like ADD INDEX(user_id); ALTER TABLE amg_like ADD INDEX(order_id); ALTER TABLE amg_order ADD INDEX(order_id); –