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

Mysql Query slow - IP-поиск (запрещен или нет)

В моем PHP файле есть функция, которая проверяет, запрещен ли IP-адрес. По какой-то причине мой сайт очень медленный, и проблема в том, когда я проверяю, запрещен ли IP-адрес или нет.

(я удаляю код, который проверяет, и мой сайт был быстрее)

Здесь мой код:

// index.php - everything redirects to this file in the .htaccess
<?php
include('config.php');
if(isIpBanned($_SERVER['REMOTE_ADDR'])) {
 die('access denied');
}
// rest of the code

здесь моя функция

// config.php
<?php
function isIpBanned($db, $ip) { // $db is declared correctly
 $goodIP = $db->getRecord("SELECT is_banned FROM security.ip WHERE ip = '$ip'"); // this function works and return 1 or 0
 return (bool)$goodIP;
}

Этот запрос занимает от 2 секунд до 3 секунд для запуска. Зачем? Я не оставил соединение или другие таблицы.

Спасибо

4b9b3361

Ответ 1

  • Поместите индекс (уникальный?) в столбец IP
  • Используйте правильный тип данных, преобразуя текстовое представление в "родной" (ipv4 вписывается в INT UNSIGNED, ipv6 в 2 BIGINT UNSIGNED): это уменьшит ваши таблицы и потребует меньше ввода /O во время сканирования

и, в качестве побочного примечания, даже если $_SERVER["REMOTE_ADDR"] должен быть безопасным, НИКОГДА НЕ ЗАБУДЬТЕСЬ ОТКРЫТЬ ДАННЫЕ В SQL QUERIES!

Ответ 2

Поместите индекс в столбец ip.

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

Я думаю, security.ip - очень большая таблица, поэтому поиск становится медленным.

Недостаток индекса: запись становится несколько медленнее, поэтому, если вы много пишете в эту таблицу, вы можете попытаться выгрузить запрещающую часть в новую таблицу, скажем banned_ips.