Подтвердить что ты не робот

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);

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

4b9b3361

Ответ 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 работает потрясающе.