【问题标题】:How to minimize this query如何最小化此查询
【发布时间】:2021-12-12 15:53:23
【问题描述】:

我的查询执行时间过长,页面出现 504 错误,我该如何解决这个查询的问题?

SELECT *,
                    schedules.id AS ids
                FROM 
                    schedules 
                INNER JOIN
                (
                    SELECT saxeli,gvari, id, pn
                    FROM dacva
                )
                    dacva 
                        ON schedules.person_id=dacva.id 
                INNER JOIN
                (
                    SELECT dasaxeleba,kodi, id, active
                    FROM obieqti
                    WHERE active=1
                )
                    obieqti 
                        ON schedules.object_id=obieqti.id 
                    INNER JOIN
                (
                    SELECT category, xelfasi, zeganakveturi, premia, object_id, date_ended
                    FROM object_guard WHERE date_ended<'$date_start'
                )
                    object_guard 
                        ON schedules.object_id=object_guard.object_id AND schedules.category=object_guard.category

【问题讨论】:

  • 嗨泰德,我怀疑一个简单的查询不会有太大帮助。请提供表格架构和您的意图,您的预期结果是什么
  • 删除所有子查询,构建普通查询。然后检查表格以获取合适的索引。
  • 为了帮助您解决query-optimization 的问题,我们需要更多信息。请read this,然后edit您的问题。

标签: mysql sql query-optimization


【解决方案1】:

由于您没有提供架构或解释,我猜测问题来自子查询 - 您可能会混淆查询优化器。

因此,删除子查询(您可能需要将 * 替换为您要检索的特定列):

SELECT *,
       schedules.id AS ids
FROM   schedules
       INNER JOIN dacva
               ON schedules.person_id = dacva.id
       INNER JOIN obieqti
               ON schedules.object_id = obieqti.id
                  AND obieqti.active = 1
       INNER JOIN object_guard
               ON schedules.object_id = object_guard.object_id
                  AND schedules.category = object_guard.category
                  AND object_guard.date_ended < '$date_start' 

接下来,您需要确保连接和 where 子句中的列上有索引。我会特别确保object_guard.date_ended 有一个索引。

【讨论】:

    【解决方案2】:

    什么MySQL版本,是否支持'WITH子句'(通用表表达式)?

    首先从最顶部删除“*”,列越少,优化的机会就越大。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多