Хорошо, моя проблема в том, что у меня есть сценарий, который загружается на каждую страницу, он проверяет, запрещен ли подписанный пользователь или нет, путем проверки столбца с именем "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!
}
Я выполнил тест с 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()
является победителем.
fetchColumn() и rowCount() оба исключаются mysql
(1) если данные слишком много в mysql, это будет влиять на выполнение
(2) другое, вы можете думать, что они одинаковы, и вы можете использовать их оба
если вы выберете первый метод, mysql вернет вам весь результат данных, он будет использовать преобразование данных, сеть, время и т.д.
поэтому вы должны подумать о своей реальной среде, чтобы решить, какой именно.
limit 1
чтобы ограничить второй поиск большего количества строк.