2015-09-04 68 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); –