ProfiPHPProfiPHP
Категория: Полезное в PHP

Правильная проверка существования записей в таблице MySQL

Ни один проект не обойдется без проверки существование записей в таблице MySQL. Например, проверка существования конкретной статьи, проверка наличие в базе Email и много других ситуаций.

Опишем возможные способы проверки существования записей и на примерах разберем, что лучше использовать: COUNT() или Mysql_num_rows.

Разберем разные варианты:
$link = mysqli_connect( DB_HOST, DB_USER, DB_PASS, DB_NAME );
$result = mysqli_query( $link, "SELECT COUNT(*) as count FROM `test` WHERE ( `id` = '9999' )" );
$row = mysqli_fetch_assoc( $result );
echo $row['count'];
Данный поиск завершился за 0.000226 секунды.

Рассмотрим второй вариант:
$result = mysqli_query( $link, "SELECT `id` FROM `test` WHERE ( `id` = '9999' )" );
echo mysqli_num_rows( $result );
В данном случае, поиск завершился за 0.000220 секунды.

Разница в данных вариантах совсем минимальная, можно даже сказать никакой. Более того, результаты могут быть в пользу как первого, так и второго примера. Первый вариант использует немного больше оперативной памяти, на данная разница не заслуживает внимания.

Теперь самое интересное! В первых двух вариантах мы искали по уникальному полю ID, где результат всегда был или 0, или 1. Если искать несколько полей, где данные могут быть одинаковыми, необходимо четко использовать разные подходы.

Теперь давайте разберемся, какой вариант где использовать:
$result = mysqli_query( $link, "SELECT `id` FROM `test` WHERE ( `cache` = '37693cfc748049e45d87b8c7d8b9aacd' )" );
if ( mysqli_num_rows( $result ) ) {
...
}
Результат выполнения для 100000 записей равен 0.07005 секунды.
$result = mysqli_query( $link, "SELECT COUNT(*) as count FROM `test` WHERE ( `cache` = '37693cfc748049e45d87b8c7d8b9aacd' )" );
$row = mysqli_fetch_assoc( $result );
if ( $row['count'] > 2 ) {
...
}
При аналогичном количестве результатов выборки скорость выполнения примера составляет 0.04640 секунды.

Как видно с результатов тестов, функцию Mysqli_num_rows нужно использовать, когда ищем существование одной уникальной записи, а COUNT(*) - если необходимо найти несколько полей. Разница в скорости почти в 2 раза быстрее.

Добавить комментарий

Имя:
Текст комментария: