SQL 查询 运行 非常慢。它在大约 23 秒内显示结果
SQL query is running very slow. It shows the results in about 23 seconds
以下 SQL 查询 运行 非常慢。它会在大约 23 秒内将结果打印到屏幕上。我该怎么做才能使查询 运行 更快。
SELECT DISTINCT P.*,U.*
FROM i_friends F FORCE INDEX(ixFriend)
INNER JOIN i_posts P FORCE INDEX (ixForcePostOwner)
ON P.post_owner_id = F.fr_two
INNER JOIN i_users U FORCE INDEX (ixForceUser)
ON P.post_owner_id = U.iuid AND U.uStatus IN('1','3') AND F.fr_status IN('me', 'flwr', 'subscriber')
WHERE P.post_owner_id='$uid' $morePost
GROUP BY P.post_id
DESC LIMIT 5
这些看起来像“过滤器”,因此将它们移至 WHERE
子句并在 ON
子句中仅保留“关系”条件。 (这不会改变性能,但会使读取查询更容易。)
AND U.uStatus IN('1','3')
AND F.fr_status IN('me', 'flwr', 'subscriber')
删除 FORCE INDEX
子句;他们今天可能会有所帮助,但明天当数据分布发生变化时就会受到伤害。
什么是$morePost
?我问是因为它可能对优化性能至关重要。
添加这些复合索引:
P: INDEX(post_owner_id, post_id)
F: INDEX(fr_status, fr_two)
U: INDEX(uStatus, iuid)
(添加复合索引时,DROP前导列相同的索引,即同时拥有INDEX(a)和INDEX(a,b)时,将前者扔掉。)
不要同时使用DISTINCT
和GROUP BY
;它可能会导致对整个数据集进行额外排序(在 JOIN 之后,但在 LIMIT 之前)。
LIMIT 5
没有 ORDER BY
让优化器选择它喜欢的 5。添加一个 ORDER BY
如果你关心哪个 5.
一个常见的性能问题来自 JOIN
和 GROUP BY
的混合。我称之为“explode-implode”。连接将数据集分解成更多的行,只是为了让 Group-by 内爆回到来自 table 之一的行。典型的解决方法是首先 select 分组 table (P
) 中的所需行。在“派生 table”中执行此操作。然后加入其他 tables。 (但是,我在这个查询中迷路了,所以我不知道它是否适用于这里。)
以下 SQL 查询 运行 非常慢。它会在大约 23 秒内将结果打印到屏幕上。我该怎么做才能使查询 运行 更快。
SELECT DISTINCT P.*,U.*
FROM i_friends F FORCE INDEX(ixFriend)
INNER JOIN i_posts P FORCE INDEX (ixForcePostOwner)
ON P.post_owner_id = F.fr_two
INNER JOIN i_users U FORCE INDEX (ixForceUser)
ON P.post_owner_id = U.iuid AND U.uStatus IN('1','3') AND F.fr_status IN('me', 'flwr', 'subscriber')
WHERE P.post_owner_id='$uid' $morePost
GROUP BY P.post_id
DESC LIMIT 5
这些看起来像“过滤器”,因此将它们移至
WHERE
子句并在ON
子句中仅保留“关系”条件。 (这不会改变性能,但会使读取查询更容易。)AND U.uStatus IN('1','3') AND F.fr_status IN('me', 'flwr', 'subscriber')
删除
FORCE INDEX
子句;他们今天可能会有所帮助,但明天当数据分布发生变化时就会受到伤害。什么是
$morePost
?我问是因为它可能对优化性能至关重要。添加这些复合索引:
P: INDEX(post_owner_id, post_id) F: INDEX(fr_status, fr_two) U: INDEX(uStatus, iuid)
(添加复合索引时,DROP前导列相同的索引,即同时拥有INDEX(a)和INDEX(a,b)时,将前者扔掉。)
不要同时使用
DISTINCT
和GROUP BY
;它可能会导致对整个数据集进行额外排序(在 JOIN 之后,但在 LIMIT 之前)。LIMIT 5
没有ORDER BY
让优化器选择它喜欢的 5。添加一个ORDER BY
如果你关心哪个 5.一个常见的性能问题来自
JOIN
和GROUP BY
的混合。我称之为“explode-implode”。连接将数据集分解成更多的行,只是为了让 Group-by 内爆回到来自 table 之一的行。典型的解决方法是首先 select 分组 table (P
) 中的所需行。在“派生 table”中执行此操作。然后加入其他 tables。 (但是,我在这个查询中迷路了,所以我不知道它是否适用于这里。)