【问题标题】:reduce left join query excution time减少左连接查询执行时间
【发布时间】:2015-11-30 19:46:48
【问题描述】:

我正在开发一个可以连接两个表并返回一些结果的 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 秒。
有谁知道减少这个时间?
对不起,我的英语太差了:)

【问题讨论】:

  • ORDER BY .... RAND() 可能正在扼杀你的表现。 RAND() 是罪魁祸首。
  • 而不是只使用列名给出 * 而不是这个 != 使用 .if 需要使用 Order by other wise 删除更快的数据检索和使用 RAND() ??跨度>
  • @Andrew 是的,我同意你的看法
  • 使用 EXPLAIN 来分析你的陈述:dev.mysql.com/doc/refman/5.5/en/explain-output.html(你必须在前面加上 EXPLAIN)
  • 我通过 RAND() 修改订单并删除 .* 并只使用我需要的列,但执行时间为 5.5

标签: php mysql sql-server join left-join


【解决方案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;

【讨论】:

  • 我在查询末尾添加了限制 1,但执行时间为 5.5
  • 您尝试过我的查询版本吗?下一步是为您的表 amg_order 和 amg_like 添加适当的索引。
  • 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);
  • 您应该添加这些索引并再次尝试查询。我想这会让你开心。 :)
  • 您删除了一些代码,例如 amg_order.user_id != :user_id 这需要不要显示给用户自己的订单
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
相关资源
最近更新 更多