2017-02-10 22 views
0
SELECT post_id FROM posts WHERE blog_id IN (15,16) ORDER BY post_id DESC 

Post_id是PRIMARY,blog_id是索引,表是innoDB和DB MariaDB。SQL:當WHERE索引IN(1,2)ORDER BY Primary時,避免文件夾

這會導致文件夾,因爲索引blog_id被用作關鍵字。 Blog_id必須是一個索引,用於查詢僅搜索一個blog_id = 15時的速度。如果blog_id不是索引,或者我使用FORCE INDEX(PRIMARY),則問題已解決,查詢速度更快。

問題是我認爲你不應該在生產應用程序上使用FORCE INDEX,也不應該使用USE INDEX?這將是第一個問題,我可以強制索引,並稱它解決?

第二個問題將是爲什麼它在這裏做文件。如果我理解正確,索引有兩個鍵,即索引鍵和主鍵,索引是由主鍵排序的?我想不是因爲如果是這樣,第一個查詢應該能夠通過索引進行搜索,並按照主要順序進行搜索而不用文件。但是在搜索一個id時它不使用filesort,而且我也不明白爲什麼它與multiples id不同。所以我不知道它爲什麼會發生。

+0

請參閱您的重複查詢的答案。 –

回答

0

嗯,我想我已經知道所有的答案。這是blog_id指數可能什麼樣子:

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

當一個索引ID搜索,它不需要做任何的文件排序,因爲每個博客IDS中的主要ID已經被訂購。
當搜索更多ID ASC或DESC時,它需要執行一個文件夾,因爲主ID在所有索引中都沒有順序。

關於FORCE INDEX。如果不使用它,數據庫將搜索與索引匹配的所有後期ID並對它們進行排序,如果查詢可能很慢的話。 如果我使用它,那麼Db將從PRIMARY的底部通過post_id進入post_id,然後檢查輔助索引上的索引鍵,直到它找到LIMIT量(如果存在LIMIT),在這種情況下它不會得到訂購所有posts_id,但它將不得不檢查兩個索引,並且如果匹配的id遠離索引,它可能也很慢。這是一個平均查詢的問題。

組合索引(post_id,blog_id)和強制的選項與PRIMARY一樣工作,所以我沒有找到任何其他可能的選項。如果任何人都可以添加一些暗示可能會使某種類型的索引性能更好,我會將您的答案標記爲正確。現在,因爲沒有答案,這將做。