【发布时间】:2016-05-09 00:20:54
【问题描述】:
我制作了一个简单的数据库(innodb 版本 5.7.9),其中包含 2 个表,post 和 post_tag。
Post 将单个字段 ID(大整数)设置为主键(大约 120,000 个条目)。 post_tag有2个字段,post_id(big int)和tag_id(int),主键在[post_id, tag_id]上。
以下查询在 ~1ms 内运行:
SELECT
SQL_NO_CACHE p.id
FROM
post as p
STRAIGHT_JOIN
post_tag t
WHERE
t.post_id = p.id AND t.tag_id = 25
ORDER BY
p.id DESC
LIMIT 0, 100
但如果我将 ORDER BY 更改为 ASC,它的运行速度会慢 100 倍!还有我感兴趣的那种……
知道为什么吗?
最初,我希望将 ID 排序为 DESC,但我发现它比 ASC 慢。我读到索引的自然排序是 ASC,所以我恢复了所有 ID(通过 ID = SOMETHING BIG - ID),但它没有改变任何东西,因为它现在在 ASC 中变慢了。
我上传了数据库here,以防它有用。
非常感谢任何可以提供帮助的人。
【问题讨论】:
-
将
WHERE更改为ON并且只是执行常规的JOIN而不是STRAIGHT_JOIN会改变什么吗? -
您可能在表上创建了一个索引,或者可能在 ID 列上默认创建了一个默认主键索引。您可以重新索引它并使其成为您想要的顺序。如果您以与索引顺序相反的顺序查询,则查询肯定会运行得更慢。只需尝试按照您要查询的顺序重新索引即可。
-
@JoachimIsaksson 将位置更改为 ON 不会改变任何内容。进行常规连接将执行计划更改为从 post_tag 表开始,这不是我想要的。原因是我的实际数据库(我在这里发布的只是一个精简的示例)有一个更复杂的索引键,需要通过 post 表启动执行计划。实际上,在这种情况下,我不需要直接加入,因为 mysql 明白这一点。因此,我只是将直接连接置于与我的实际数据库相同的条件下。
标签: mysql performance sorting innodb