Mysql SQL_CALC_FOUND_ROWS и нумерация страниц - PullRequest
12 голосов
/ 22 января 2011

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

Ответы [ 3 ]

7 голосов
/ 22 января 2011

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

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

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

5 голосов
/ 24 января 2011

Подробный рассказ о реализации стиля Google , нумерация страниц с использованием MySQL

0 голосов
/ 12 апреля 2012

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

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

...