【发布时间】:2017-02-10 19:10:18
【问题描述】:
我将通过这样的查询来解释自己:(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
【问题讨论】:
-
你真的在做
SELECT post_id,而不是SELECT *?这对 this 问题有重大影响。 -
是的,因为它是一个更大的子查询,我在其中选择 * 并连接到其他表,并且在一年前的上一个问题中,我被告知这种形式更有效,而且确实如此。 stackoverflow.com/questions/30414641/…