ВЫБЕРИТЕ КОЛИЧЕСТВО() по сравнению с числовыми строками 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);
Author: Community, 2012-10-12

3 answers

Используйте COUNT, внутренне сервер будет обрабатывать запрос по-другому.

При выполнении COUNT сервер будет выделять память только для хранения результата подсчета.

При использовании mysql_num_rows сервер обработает весь набор результатов, выделит память для всех этих результатов и переведет сервер в режим выборки, который включает в себя множество различных деталей, таких как блокировка.

Думайте об этом как о следующем псевдо сценарии:

SELECT COUNT(*)

Эй, Боб, сколько человек в классной комнате?

mysql_num_rows

Эй, Боб, пришли ко мне всех людей из класса,... Я сам пересчитаю их, чтобы узнать количество людей

Таким образом, при использовании mysql_num_rows вы передаете все записи клиенту, и клиенту придется самому вычислять количество.

 34
Author: Matthew, 2017-12-01 07:32:56

Используйте СЧЕТЧИК (идентификатор). Он возвращает только количество, с mysql_num_rows($result); php извлекает ВСЕ данные из mysql и подсчитывает количество найденных результатов.

И, наконец, не используйте функции mysql_*.

Предлагаемые альтернативы

Использование этого расширения не рекомендуется. Вместо этого MYSQLI или PDO_MySQL следует использовать расширение. См. также MySQL: руководство по выбору API и связанные с ним часто задаваемые вопросы для получения дополнительной информации. Альтернативы этой функции включают:

Mysqli_stmt_num_rows() PDOStatement::Количество строк()

 2
Author: CappY, 2012-10-12 17:55:52

Протестировано в 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 набора записей за несколько миллисекунд!

 1
Author: Alireza.A, 2017-12-02 09:24:40