Intereting Posts
Синтаксическая ошибка Sql с использованием запроса базы данных UPDATE PHP DOM перемещает узлы HTML и дочерние узлы Получение списка videoId в массиве с помощью api v3 playlistItems YouTube и создание другого видео-запроса для получения статистики viewCount используя цикл foreach для инициализации переменных Уникальный URL для просмотра статьи Автоматическое определение внутренней / внешней среды разработки Я хочу создать несколько PDF-файлов в цикле, используя dompdf? Автоматическое увеличение на 1 в MySQL с помощью clearDB Ошибка Laravel Route не работает. Пытается получить свойство не объекта Обслуживание изображений вне корневого каталога Шифрование AES с использованием Java и PHP Проблема с идентификацией кода Неустранимая ошибка: обратный вызов массива должен содержать индексы 0 и 1 Скрыть входные значения из исходного кода PHP Fatal Error: вызов неопределенного метода

SQL и PHP – что быстрее mysql_num_rows () или «select count ()»?

Мне просто интересно, какой метод наиболее эффективен, если я просто хочу получить количество строк в таблице.

$res = mysql_query("SELECT count(*) as `number` FROM `table1`"); $count = mysql_fetch_result($res,0,'number'); 

или

 $res = mysql_query("SELECT `ID` FROM `table1`"); $count = mysql_num_rows($res); 

Кто-нибудь сделал приличное тестирование на этом?

mysql_query () переносит все записи результатов из MySQL в php pcrocess, прежде чем он вернется (в отличие от mysql_unbufferd_query () ). Только это сделает mysql_num_rows () более медленной.

Кроме того, для некоторых движков (например, MyISAM) MySQL может обслуживать запрос Count (*) из индекса таблицы без попадания фактических данных . SELECT * FROM foo другой стороны, SELECT * FROM foo приводит к полному сканированию таблицы, и MySQL должен читать каждый отдельный набор данных.

Определенно первый. Обычно MySQL может делать это, глядя на индекс, а не на всю таблицу, и если вы используете MyISAM (по умолчанию), количество строк для таблицы хранится в метаданных таблицы и будет немедленно возвращено.

Второй способ будет не только считывать всю таблицу в память, но и отправлять ее клиенту по сети, прежде чем клиент будет считать строки. Чрезвычайно расточительный!

Тест в базе данных с более чем 2300000 строк , введите: InnoDB , размер около 1 GiB, используя xhprof

test1:

  ....SELECT COUNT(id) as cnt FROM $table_name....; row= mysqli_fetch_assoc($res2); echo $row['cnt']; //result1: 1,144,106 1,230,576 1,173,449 1,163,163 1,218,992 

test2:

 ....SELECT COUNT(*) as cnt FROM $table_name....; row= mysqli_fetch_assoc($res2); echo $row['cnt']; //result2: 1,120,253 1,118,243 1,118,852 1,092,419 1,081,316 

test3:

  ....SELECT * FROM $table_name....; echo mysqli_num_rows($res2); //result3: 7,212,476 6,530,615 7,014,546 7,169,629 7,295,878 

test4:

  ....SELECT * FROM $table_name....; echo mysqli_num_rows($res2); //result4: 1,441,228 1,671,616 1,483,050 1,446,315 1,647,019 

заключение: самый быстрый метод находится в test2:

 ....SELECT COUNT(*) as cnt FROM $table_name....; row= mysqli_fetch_assoc($res2); echo $row['cnt']; 

Думаю, count(1) будет еще быстрее:

 $res = mysql_query("SELECT count(1) as `number` FROM `table1`"); $count = mysql_fetch_result($res,0,'number'); 

Хотя они и не пробовали предлагаемые методы, первая делает базу данных извлекать все записи и подсчитывать их в базе данных, вторая делает базу данных выборкой отдельного поля для всех записей и подсчета количества результатов на сервере.
Как правило, чем меньше данных вы получаете за конкретную запись, тем меньше времени на это потребуется, поэтому я проголосую за обновленный первый метод (выборка константы для каждой записи и подсчет количества выбранных констант).

Я действительно не думаю, что тестирование необходимо.

Выполнение COUNT в запросе SQL

1) Отправляет только одну строку данных обратно клиенту (вместо каждой строки)

2) Позволяет SQL делать подсчет для вас, который, вероятно, будет быстрее, чем PHP.

Использование Count с индексом и inodb делает его слишком медленным, но при использовании его с mysqli_num_rows он возвращается без какой-либо задержки. вы можете проверить результат mysqli_num_rows по адресу http://ssajalandhar.org/generalinstruction-0-1-0.html, чтобы не загружать часть секунды. Для меня mysqli работает потрясающе.