gpt4 book ai didi

mysql - 在某些情况下避免 MySQL 'using temporary'

转载 作者:行者123 更新时间:2023-11-29 09:00:35 26 4
gpt4 key购买 nike

我有两个表,用户关注者:

用户:

id          INT, PRIMARY_KEY
name VARCHAR
joined INT

此表根据 idjoined 建立索引。

表“关注者”:

user        INT
follows INT

此表在用户关注上建立索引。

此查询查找在特定时间后加入的特定用户后面的所有用户的名称。结果需要是按时间倒序排列。

SELECT u.name 
FROM users u, followers f
WHERE f.user = X
AND f.follows = u.id
AND u.joined > 1234
ORDER BY u.joined DESC

现在,当用户 X 拥有大量关注者时,EXPLAIN 会给出以下信息:

id      key             extra
-----------------------------------
u joined Using where
f follows Using index

到目前为止一切顺利。 (“using where”是由于我为简洁起见删除了一些其他子句)。

但是,当用户 X 的关注者数量较少时,就会发生这种情况:

id      key             extra
-----------------------------------
f follows Using temporary, using filesort
u joined Using where

如果我省略ORDER BY,我会得到:

id      key             extra
-----------------------------------
f follows
u joined Using where

MySQL 优化器似乎正在检查它必须处理的行数,如果它很小,则执行首先是followers表。它似乎在优化步骤中忽略了ORDER BY,导致查询速度变慢到临时表。

所以(最后),我的问题是:是否可以强制 MySQL 执行表搜索的顺序,并且在可能的情况下这是不可能的,是否有另一种方法可以摆脱 使用临时

最佳答案

MySQL确实提供了一个子句“STRAIGHT_JOIN”,它告诉它按照您提供的顺序在表之间进行连接。由于您正在寻找单个特定的“关注者用户”,因此请将关注者表放在前面并从中加入...尝试类似

SELECT STRAIGHT_JOIN
u.name
from
followers f
join Users u
on f.follows = u.id
and u.joined > 1234
where
f.user = X
order by
u.joined DESC

这应该强制从特定于用户 ID = X 的“Followers”表开始,然后根据 f.user = X 返回的行作为 SECONDARY 联接到用户表。确保您的 Followers 表有索引其中“user”位于第一个位置(如果您在两列上的索引都是(follows,user),则它应该是(user,follows)。查询基础上的最小粒度是查询的一个人...排在第一位。

关于mysql - 在某些情况下避免 MySQL 'using temporary',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8744036/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com