Doctrine2 ORM慢查询优化

时间:2017-02-03 14:21:37

标签: mysql doctrine-orm

我正在努力使查询足够有效。我正在使用Doctrine2 ORM(查询是使用QueryBuilder构建的),我的部分查询运行速度非常慢 - 大约需要4s,表格为5000行。

这是db schema的相关部分:

END

这就是我的查询的样子(它是基本版本,有很多过滤器需要应用,但现在这些工作都很好)

TABLE user
id (primary)
... (plenty of rows, not relevant to the query)

TABLE slot
id (primary)
user_id (foreign for user)
date (datetime)

让我解释一下我在这里想要实现的目标: 我需要过滤在1周前和1周之间有任何插槽的用户,然后按照现在和提前1周之间可用的插槽数量对它们进行排序。导致问题的查询部分是s_filter的LEFT JOIN,我想知道是否有办法提高该查询的性能?

真的有任何帮助,即使它只是普通的SQL我会尝试将它自己转换为DQL!

@UPDATE 只是我忘记了一个额外的信息,查询中的LIMIT用于分页目的!

@UPDATE 2 经过一段时间调整查询后,我发现我可以使用JOIN进行过滤而不是LEFT JOIN + COUNT,所以我的查询现在看起来像这样:

SELECT 
  u.id AS uid, 
  COUNT(DISTINCT s_order.id) AS sclr_1, 
  COUNT(DISTINCT s_filter.id) AS sclr_2 
FROM 
  user u 
  LEFT JOIN slot s_order ON (s_order.user_id = u.id) 
  LEFT JOIN slot s_filter ON (s_filter.user_id = u.id) 
WHERE 
  (
    (
      (
        s_order.date BETWEEN ? 
        AND ?
      ) 
      AND (
        s_filter.date BETWEEN ? 
        AND ?
      )
    ) 
    AND (u.deleted_at IS NULL)
  ) 
  AND u.userType IN ('2') 
GROUP BY 
  u.id 
HAVING 
  sclr_2 > 0 
ORDER BY 
  sclr_1 DESC 
LIMIT 
  12

它从4.1-4.3s下降到3.6~

0 个答案:

没有答案