PHP и PDO: что быстрее? Получение COUNT (*) или rowCount ()?

0

Хорошо, моя проблема в том, что у меня есть сценарий, который загружается на каждую страницу, он проверяет, запрещен ли подписанный пользователь или нет, путем проверки столбца с именем "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!
}
  • 3
    Проверь это! Эхо разница во времени между временем начала и окончания. Делай это много раз.
  • 1
    Можно добавить limit 1 чтобы ограничить второй поиск большего количества строк.
Показать ещё 4 комментария
Теги:
mysqli
pdo

2 ответа

0
Лучший ответ

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

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() является победителем.

  • 0
    Вы пробовали код из дубликата, помеченного? Было бы интересно, если у вас уже есть что-то настроено.
  • 0
    Спасибо, это отличный прямой ответ.
Показать ещё 2 комментария
1
  1. select COUNT (*) отличается от select *.
  2. fetchColumn() и rowCount() оба исключаются mysql

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню