我有两张桌子,users
并且followers
:
表users
:
id INT, PRIMARY_KEY
name VARCHAR
joined INT
该表在id
和上编制索引joined
。
表“追随者”:
user INT
follows INT
该表在users
和上编制索引follows
。
此查询查找在特定时间后加入的特定用户后跟的所有用户的名称。结果需要按时间倒序排列。
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
到现在为止还挺好。(“使用 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 执行表搜索的顺序,并且在可能的情况下这是不可能的,还有其他方法可以摆脱using temporary
吗?