Я собираюсь объяснить себе, с помощью запроса, как это: (post_id = PRIMARY, blog_id = индекс)SQL Повышение эффективности: Ограничить количество FileSort
SELECT post_id FROM posts WHERE blog_id IN (2,3,...) ORDER BY post_id DESC LIMIT 10
Update: идентификаторы в IN() может быть многочисленным. Если DB использует blog_id в качестве ключа для запроса, он должен сделать FileSort, так как индекс будет выглядеть следующим образом:
(blog_id,post_id)-> (1,55) (1,59) (1,69) (2,57) (2,71) (2,72) (3,12)
Если вместо IN() вы ищете только один идентификатор blog_id = 2, ему не нужно делать никаких файлов, потому что все совпадения уже в порядке.
Проблема, с которой я думаю, что это происходит, а не на 100% уверенно, но просто глядя на время выполнения запросов, заключается в том, что если я добавлю LIMIT 10, эффективным способом будет только ловить и filesort последние 10 идентификаторов каждого blog_id, возможно, он уже делает это, но выглядит как IN (2,3,4) ORDER BY post_id DESC LIMIT 10, он filesorts тысяч идентификаторов вместо 30.
Я надеюсь, что я просто неверно, потому что, если я не это, это ужасная неэффективная ошибка. Если я прав, есть ли двигатель или изменение, которое я мог бы сделать? даже изменить базу данных. В настоящее время я на 10.1.13-MariaDB, а таблица InnoDB
Действительно ли вы выполняете 'SELECT post_id', а не' SELECT * '? Это имеет существенное значение для этого вопроса. –
Да, поскольку это подзапрос большего, где я выбираю * и присоединяется к другим таблицам, и уже в предыдущем вопросе год назад мне сказали, что эта форма была более эффективной для этого, и это было. http://stackoverflow.com/questions/30414641/avoid-filesort-with-inner-join-order-by – Vixxs