MySQL почав SQL_CALC_FOUND_ROWS
знімати функціональність з версії 8.0.17 і далі.
Отже, завжди бажано розглянути можливість виконання вашого запиту за допомогою LIMIT
, а потім другий запит з COUNT(*)
і без, LIMIT
щоб визначити, чи є додаткові рядки.
З документів :
Модифікатор запитів SQL_CALC_FOUND_ROWS та супровідна функція FOUND_ROWS () застаріли як MySQL 8.0.17 і будуть видалені в майбутній версії 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 ( ) може використовувати оптимізації, які неможливо виконати при пошуку всього набору результатів (наприклад, fileort можна пропустити на COUNT (*), тоді як з CALC_FOUND_ROWS ми повинні відключити деякі оптимізації файлів, щоб гарантувати правильний результат)
Що ще важливіше, вона має дуже незрозумілу семантику в ряді ситуацій. Зокрема, коли запит має кілька блоків запитів (наприклад, з UNION), просто немає можливості обчислити кількість рядків "очікуваних" одночасно із створенням дійсного запиту. Оскільки виконавець ітератора просувається до таких запитів, намагатися зберегти ту саму семантику справді важко. Крім того, якщо в запиті є декілька LIMIT (наприклад, для похідних таблиць), не обов'язково зрозуміло, до якого з них слід посилатися SQL_CALC_FOUND_ROWS. Таким чином, такі нетривіальні запити обов'язково отримають різну семантику у виконавця ітератора порівняно з тим, що вони мали раніше.
Нарешті, більшість випадків використання, коли SQL_CALC_FOUND_ROWS здасться корисним, слід просто вирішити іншими механізмами, ніж LIMIT / OFFSET. Наприклад, телефонна книга повинна бути болючою за літером (як з точки зору UX, так і з точки зору використання індексу), а не за номером запису. Обговорення все частіше нескінченно прокручуються впорядковано за датою (знову ж дозволяється використання індексу), а не на сторінках за номером пошти. І так далі.
SQL_CALC_FOUND_ROWS
зайняттям понад 20 секунд; використання окремогоCOUNT(*)
запиту займало менше 5 секунд (для обох запитів підрахунку + результатів).