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);
Кто-нибудь сделал приличное тестирование на этом?
Ответы
Ответ 1
mysql_query() переносит все записи результатов из MySQL в php pcrocess, прежде чем он вернется (в отличие от mysql_unbufferd_query()). Только это сделает mysql_num_rows() более медленной.
Кроме того, для некоторых движков (например, MyISAM) MySQL может обслуживать запрос Count (*) из индекса таблицы без попадания фактических данных, A SELECT * FROM foo
, с другой стороны, приводит к полному сканированию таблицы, и MySQL должен читать каждый отдельный набор данных.
Ответ 2
Определенно первое. Обычно MySQL может делать это, глядя на индекс, а не на всю таблицу, и если вы используете MyISAM (по умолчанию), количество строк для таблицы сохраняется в метаданных таблицы и будет возвращено мгновенно.
Второй способ будет не только считывать всю таблицу в память, но и отправлять ее клиенту через сеть, прежде чем клиент будет считать строки. Чрезвычайно расточительный!
Ответ 3
Тестирование в базе данных с более чем 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'];
Ответ 4
Я думаю, count(1)
будет еще быстрее:
$res = mysql_query("SELECT count(1) as `number` FROM `table1`");
$count = mysql_fetch_result($res,0,'number');
Несмотря на то, что они не пробовали предлагаемые методы, первая делает базу данных извлекать все записи и подсчитывать их в базе данных, вторая делает базу данных выборкой отдельного поля для всех записей и подсчитывает количество результатов на сервере. < ш > Как правило, чем меньше данных вы извлекаете для конкретной записи, тем меньше времени на это потребуется, поэтому я проголосую за обновленный первый метод (выборка константы для каждой записи и подсчет количества выбранных констант).
Ответ 5
Я действительно не думаю, что нужно какое-либо тестирование.
Выполнение COUNT в запросе SQL
1) Отправляет только одну строку данных обратно для клиента (вместо каждой строки)
2) Позволяет SQL выполнять подсчет для вас, который, вероятно, всегда будет быстрее PHP.
Ответ 6
Использование Count с индексом и inodb делает его слишком медленным, но при использовании его с mysqli_num_rows оно возвращается без какой-либо задержки. вы можете проверить результат mysqli_num_rows на http://ssajalandhar.org/generalinstruction-0-1-0.html, чтобы не загружать часть секунды. Для меня mysqli работает потрясающе.