【问题标题】:Mysql query need to optimizeMysql查询需要优化
【发布时间】:2018-12-21 16:02:33
【问题描述】:

从 a 中选择 a.id,b.name 在 a.lead_id = b.lead_id 上左连接 b 其中 a.status = 'Created' 和 date(a.createdenter code here_at) = '2018-11-19'

【问题讨论】:

  • 看到这个查询很奇怪。除了将 table2 行外连接到 table1 行之外,您还有什么特别想实现的吗?我认为 fa06 在他们的回答中是正确的,您实际上所做的只是一个简单的外部连接。 (不过,您的查询中存在复制和粘贴错误。您将其称为 table1,但访问名称为lead 的表。)下次请告诉我们涉及的表,特别是唯一键是什么。这可以有所作为。显示示例表数据和结果总是很有帮助的。
  • 以上评论指的是最初发布的查询。现在显示的查询是 fa06 的答案中建议的查询。 @Narendra Rawat:不要如此彻底地改变你的要求。请不要忽视 cmets。我告诉过您,您应该提供有关表格的更多信息并显示示例数据。你完全改变了你的请求,甚至没有对此做出反应。
  • 对于 SQL 优化请求,您应该:1) 描述表,2) 列出所有现有索引,3) 显示执行计划 (dev.mysql.com/doc/refman/8.0/en/using-explain.html)。 (但现在请参阅我对 fa06 答案的评论。我认为这个查询已经足够好了。您所要做的就是创建适当的索引。)

标签: mysql


【解决方案1】:

你可以试试下面 -

select a.lead_id, b.abc from table1 a
left join table2 b on a.lead_id = b.lead_id
where a.status = 'Created' and date(a.created_at) = '2018-11-19'

【讨论】:

  • 我提出了相同的查询。我花了一段时间才明白,尽管有所有这些子查询和 in 子句,原始查询就是这样做的。
  • 表a和b都有大数据集
  • select a.lead_id, b.abc from table1 a left join table2 b on a.lead_id = b.lead_id where a.status = 'Created' and date(a.created_at) = '2018- 11-19'
  • @Narendra Rawat:这是直截了当的查询。不要试图干预它以以某种方式“优化”它。而是提供适当的索引。我的建议:create index idxa on a(status, created_at, lead_id)create index idxb on b(lead_id, abc)。这些都涵盖了首先授予对所需 a 记录的快速访问权限的索引,然后是与 b 的有效连接。
【解决方案2】:

您能否将查询拆分为两个单独的单个查询,然后根据您在应用程序端使用的条件合并结果集?我认为,如果该场景是由多个用户执行此操作的情况下,这至少会比现有的提供更好的性能。 我的意思是这样的:

查询-1:

select a.id from table1 a where a.status = 'Created' and date(a.createdenter code here_at) = '2018-11-19'

并且 查询2:

select b.lead_id, b.name from table2 b.

然后合并两个结果集。或使用 a.id 列表(来自结果集)来自 使用查询 2 的 IN 子句的查询 1 结果,即:

select b.lead_id, b.name from table2 b where b.lead_id IN( all your a.ids here)

[如果根本没有 a.id,必须检查空列表]。

【讨论】:

    猜你喜欢
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 2013-11-18
    • 2011-08-05
    • 2021-02-01
    • 1970-01-01
    相关资源
    最近更新 更多