Подтвердить что ты не робот

Mysql SQL_CALC_FOUND_ROWS и разбивка на страницы

Итак, у меня есть таблица, насчитывающая чуть более 5 миллионов строк. Когда я использую SQL_CALC_FOUND_ROWS, запрос просто зависает навсегда. Когда я его вынимаю, запрос выполняется в течение второго значения LIMIT, 25. Мой вопрос состоит в том, что для разбивки на страницы есть альтернатива получению количества полных строк?

4b9b3361

Ответ 1

SQL_CALC_FOUND_ROWS заставляет MySQL проверять все соответствующие строки, даже если они никогда не будут извлечены. Внутренне это равносильно выполнению одного и того же запроса без предложения LIMIT.

Если фильтрация, которую вы делаете через WHERE, не слишком сумасшедшая, вы можете вычислять и кэшировать различные типы фильтров для сохранения полной нагрузки сканирования, наложенной calc_found_rows. В основном выполните "select count (*) from... where...." для наиболее возможных, где предложения.

В противном случае вы можете пойти в стиле Google и просто выплюнуть некоторые номера страниц, которые иногда не имеют никакого отношения к реальности (вы знаете, вы видите "Goooooooooooogle", попадаете на страницу 3 и неожиданно заканчиваете результаты).

Ответ 3

В зависимости от ситуации вам следует выбирать между COUNT (*) и SQL_CALC_FOUND_ROWS. Если в критериях поиска запроса используются строки, которые находятся в индексе, используйте COUNT (*). В этом случае Mysql будет "читать" из индексов только, не касаясь фактических данных в таблице, в то время как метод SQL_CALC_FOUND_ROWS будет загружать строки с диска, что может быть дорогостоящим и трудоемким на больших таблицах.

Дополнительная информация по этой теме в в этой статье @mysqlperformanceblog.