PHP и PDO: что быстрее?Получение COUNT (*) или rowCount ()? - PullRequest
0 голосов
/ 21 мая 2018

ОК, моя проблема в том, что у меня есть скрипт, который загружается на каждую страницу, он проверяет, заблокирован ли вошедший в систему пользователь, проверяя столбец с именем «banned», который может выводить либо 0 (не забанено), либо 1 (запрещен).Я пытался найти это, но не нашел абсолютного ответа, который работает лучше:

Получение запроса COUNT (*):

$query = $PDO->prepare("SELECT COUNT(*) FROM users WHERE id = :ID AND banned = 1");
$query->execute(array(":ID" => $USER_ID));
if ($query->fetchColumn() > 0) {
    // USER IS BANNED! SHOW ERROR MESSAGE!
}

Использование rowCount () вместовыборка:

$query = $PDO->prepare("SELECT banned FROM users WHERE id = :ID AND banned = 1");
$query->execute(array(":ID" => $USER_ID));
if ($query->rowCount() > 0) {
    // USER IS BANNED! SHOW ERROR MESSAGE!
}

Ответы [ 2 ]

0 голосов
/ 21 мая 2018
  1. select COUNT (*) отличается от select *.
  2. fetchColumn () и rowCount () оба выполняются mysql

    (1), если данныеслишком много в mysql, это повлияет на выполнение

    (2) другого, вы можете думать, что они одинаковы, и вы можете использовать оба из них

  3. , если вы выберете первыйметод, mysql вернет вам все результаты данных, он будет использовать преобразование данных, сеть, время и т. д.

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

0 голосов
/ 21 мая 2018

Я выполнил тест с 200 000 случайно сгенерированных записей с тремя столбцами id, name и banned.3467 пользователей были случайно выбраны, чтобы быть заблокированными.Я использую следующую конфигурацию на микроэкземпляре AWS:

PHP 7.0.30-0

Ubuntu 0.16.04.1

MySQL 5.7.22-0

Результаты тестов:

COUNT(*) execution took 0.00022506713867188 seconds

rowcount() execution took 0.00011420249938965 seconds

rowcount() - победитель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...