我正在努力使查询足够有效。我正在使用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~