ВЫБЕРИТЕ КОЛИЧЕСТВО() по сравнению с числовыми строками mysql();
У меня есть большая таблица (60+) миллионов записей.
Я использую PHP-скрипт для навигации по этой таблице.
PHP-скрипт (с разбиением на страницы) загружается очень быстро, потому что:
Механизм таблиц является InnoDB, поэтому SELECT COUNT()
очень медленный и mysql_num_rows()
не является опцией, поэтому я сохраняю общее количество строк (число, которое я использую для создания разбивки на страницы) в отдельной таблице (я обновляю эту запись total_rows=total_rows-1
и total_rows=total_rows1+1
во время DELETE
и INSERT
).
Но вопрос в том, что делать с разбивка на страницы результатов поиска?
Прямо сейчас я делаю это с помощью 2 шагов:
1.
$condition = " fname='rinchik' ";
$result = "SELECT * FROM my_large_table WHERE" . $condition;
Здесь я получил все результаты поиска из базы данных.
2. Теперь мне нужно подсчитать эти результаты, чтобы создать разбивку на страницы. Я делаю это:
$condition; <- we already have this from the step 1
$result_count = "SELECT COUNT(id) FROM my_large_table WHERE" . $condition;
И это довольно медленно.
Было бы лучше, если бы я сделал это таким образом (всего одним шагом)?:
$condition = " fname='rinchik' ";
$result = "SELECT * FROM my_large_table WHERE" . $condition;
$result_count = mysql_num_rows($result);
3 answers
Используйте COUNT
, внутренне сервер будет обрабатывать запрос по-другому.
При выполнении COUNT
сервер будет выделять память только для хранения результата подсчета.
При использовании mysql_num_rows
сервер обработает весь набор результатов, выделит память для всех этих результатов и переведет сервер в режим выборки, который включает в себя множество различных деталей, таких как блокировка.
Думайте об этом как о следующем псевдо сценарии:
SELECT COUNT(*)
Эй, Боб, сколько человек в классной комнате?
mysql_num_rows
Эй, Боб, пришли ко мне всех людей из класса,... Я сам пересчитаю их, чтобы узнать количество людей
Таким образом, при использовании mysql_num_rows
вы передаете все записи клиенту, и клиенту придется самому вычислять количество.
Используйте СЧЕТЧИК (идентификатор). Он возвращает только количество, с mysql_num_rows($result);
php извлекает ВСЕ данные из mysql и подсчитывает количество найденных результатов.
И, наконец, не используйте функции mysql_*.
Предлагаемые альтернативы
Использование этого расширения не рекомендуется. Вместо этого MYSQLI или PDO_MySQL следует использовать расширение. См. также MySQL: руководство по выбору API и связанные с ним часто задаваемые вопросы для получения дополнительной информации. Альтернативы этой функции включают:
Mysqli_stmt_num_rows() PDOStatement::Количество строк()
Протестировано в inoDB
движке и mysql 5.5.
У id
есть индекс, и я думаю, что это очень быстро
$q = "SELECT count(`id`) FROM table where 1";
$rows = mysql_query($q);
$count = mysql_fetch_array($rows);
echo $count[0];
Если вы хотите больше, вам нужно использовать один индекс только для id
или того, что вы хотите выбрать.
Кэширование - это еще одно решение, и вы можете выбрать один из 1 набора записей за несколько миллисекунд!