gpt4 book ai didi

mysql - SQL 提高效率 : LIMIT the amount of FILESORT

转载 作者:太空宇宙 更新时间:2023-11-03 11:40:28 26 4
gpt4 key购买 nike

我将用这样的查询来解释自己:(post_id= PRIMARY, blog_id=index )

SELECT post_id FROM posts WHERE blog_id IN (2,3,...) ORDER BY post_id DESC LIMIT 10

更新:IN() 中的 ID 可能很多。如果数据库使用 blog_id 作为查询的键,它必须进行文件排序,因为索引看起来像这样:

(blog_id,post_id)-> (1,55) (1,59) (1,69) (2,57) (2,71) (2,72) (3,12)

如果您只搜索一个 id blog_id = 2 而不是 IN(),则它不需要执行任何文件排序,因为所有匹配项都已按顺序排列。

我认为它正在发生的问题,不是 100% 确定,只是通过查看查询执行时间,如果我添加 LIMIT 10,有效的方法是只捕获和文件排序每个 blog_id 的最后 10 个 ID索引键匹配,也许它已经这样做了,但看起来像 IN (2,3,4) ORDER BY post_id DESC LIMIT 10,它对数千个 ID 进行文件排序,而不是 30 个。

我希望我完全错了,因为如果我没有错,那将是一个非常低效的错误。如果我是对的,我可以做任何引擎或更改吗?甚至更改数据库。目前我在 10.1.13-MariaDB 上,表是 InnoDB

最佳答案

不幸的是,MySQL 没有索引让你做你想做的事。

但是,您可以重写您的查询并使用现有索引:

SELECT p.post_id
FROM ((SELECT post_id
FROM posts
WHERE blog_id = 2
ORDER BY post_id DESC
LIMIT 10
) UNION ALL
(SELECT post_id
FROM posts
WHERE blog_id = 3
ORDER BY post_id DESC
LIMIT 10
)
) p
ORDER BY post_id DESC
LIMIT 10;

每个子查询都会使用索引。对 20 个元素进行排序非常快。

关于mysql - SQL 提高效率 : LIMIT the amount of FILESORT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42166944/

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