MySQL начал SQL_CALC_FOUND_ROWS
отказываться от функциональности начиная с версии 8.0.17.
Таким образом, всегда предпочтительнее рассмотреть возможность выполнения вашего запроса с LIMIT
, а затем второй запрос с COUNT(*)
и без, LIMIT
чтобы определить, есть ли дополнительные строки.
Из документов :
Начиная с MySQL 8.0.17, модификатор запроса SQL_CALC_FOUND_ROWS и сопровождающая его функция FOUND_ROWS () устарели и будут удалены в будущей версии MySQL.
COUNT (*) подлежит определенной оптимизации. SQL_CALC_FOUND_ROWS приводит к отключению некоторых оптимизаций.
Используйте эти запросы вместо:
SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;
Кроме того, SQL_CALC_FOUND_ROWS
было замечено, что в общем есть больше проблем, как объяснено в MySQL WL # 12615 :
SQL_CALC_FOUND_ROWS имеет ряд проблем. Прежде всего, это медленно. Часто было бы дешевле выполнить запрос с LIMIT, а затем с отдельным SELECT COUNT ( ) для того же запроса, поскольку COUNT ( ) может использовать оптимизации, которые невозможно выполнить при поиске всего набора результатов (например, файловой сортировки). можно пропустить для COUNT (*), тогда как с CALC_FOUND_ROWS мы должны отключить некоторые оптимизации сортировки файлов, чтобы гарантировать правильный результат)
Что еще более важно, он имеет очень нечеткую семантику в ряде ситуаций. В частности, когда запрос имеет несколько блоков запроса (например, с помощью UNION), просто невозможно рассчитать количество строк, которые могли бы быть одновременно, и создать правильный запрос. По мере того, как исполнитель итераторов продвигается к таким запросам, действительно трудно попытаться сохранить ту же семантику. Кроме того, если в запросе несколько LIMIT (например, для производных таблиц), не обязательно понятно, на какой из них следует ссылаться в SQL_CALC_FOUND_ROWS. Таким образом, такие нетривиальные запросы обязательно получат другую семантику в исполнителе итератора по сравнению с тем, что они имели раньше.
Наконец, большинство случаев использования, где SQL_CALC_FOUND_ROWS может показаться полезным, должны быть просто решены с помощью других механизмов, кроме LIMIT / OFFSET. Например, телефонная книга должна быть разбита на страницы по буквам (как с точки зрения UX, так и с точки зрения использования индекса), а не по номеру записи. Обсуждения становятся все более бесконечными, упорядоченные по дате (опять же, позволяя использовать индекс), а не по нумерации страниц. И так далее.
SQL_CALC_FOUND_ROWS
занял более 20 секунд; использование отдельногоCOUNT(*)
запроса заняло менее 5 секунд (для обоих запросов count + result).