Mysql Doctrine2 ORM慢速查询优化

Mysql Doctrine2 ORM慢速查询优化,mysql,doctrine-orm,Mysql,Doctrine Orm,我正在努力使查询足够有效。我使用的是doctrine2orm(查询是使用QueryBuilder生成的),我的部分查询运行速度非常慢,大约需要4秒,表有5000行 这是db模式的相关部分: TABLE user id (primary) ... (plenty of rows, not relevant to the query) TABLE slot id (primary) user_id (foreign for user) date (datetime) 这就是我的查询看起来的样子(

我正在努力使查询足够有效。我使用的是doctrine2orm(查询是使用QueryBuilder生成的),我的部分查询运行速度非常慢,大约需要4秒,表有5000行

这是db模式的相关部分:

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_过滤器的左连接,我想知道是否有办法提高该查询的性能

非常感谢您的帮助,即使只是简单的SQL,我也会尝试自己将其转换为DQL

@更新 只是我忘记了一个附加信息,查询中的限制是用于分页的

@更新2 调整查询一段时间后,我发现我可以使用JOIN进行过滤,而不是使用LEFT JOIN+COUNT,因此我的查询现在看起来确实是这样的:

SELECT 
    u.id AS uid, COUNT(DISTINCT s_order.id) AS ordinal
FROM
    langu_user u
        LEFT JOIN
    slot s_order ON (s_order.user_id = u.id) AND s_order.date BETWEEN '2017-02-03 14:03:22' AND '2017-02-10 14:03:22'
        JOIN
    slot s_filter ON (s_filter.user_id = u.id) AND s_filter.date BETWEEN '2017-01-27 14:03:22' AND '2017-02-10 14:03:22'
WHERE
u.deleted_at IS NULL
AND u.userType IN ('2')
GROUP BY u.id
ORDER BY ordinal DESC
LIMIT 12

它从4.1-4.3s降到了3.6 ~

你在s_order.user_id和s_filter.user_id上有了适当的索引(至少)@scaisEdge是的,条令将索引添加到所有外键列。真正的问题是嵌套循环的s_顺序,如果我在s_过滤器上去掉count distinct(我发现可能是内部连接来过滤这些),没有人有更多的想法了吗(
SELECT 
    u.id AS uid, COUNT(DISTINCT s_order.id) AS ordinal
FROM
    langu_user u
        LEFT JOIN
    slot s_order ON (s_order.user_id = u.id) AND s_order.date BETWEEN '2017-02-03 14:03:22' AND '2017-02-10 14:03:22'
        JOIN
    slot s_filter ON (s_filter.user_id = u.id) AND s_filter.date BETWEEN '2017-01-27 14:03:22' AND '2017-02-10 14:03:22'
WHERE
u.deleted_at IS NULL
AND u.userType IN ('2')
GROUP BY u.id
ORDER BY ordinal DESC
LIMIT 12