Мне просто интересно, какой метод наиболее эффективен, если я просто хочу получить количество строк в таблице.
$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 работает потрясающе.