медленный запрос mysql - Поиск по 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 секунд. Почему? У меня нет левого соединения или других таблиц.
Спасибо
2 answers
- Поместите (уникальный?) индекс в столбец
IP
- Используйте правильный тип данных, преобразовав текстовое представление в "собственное" (ipv4 помещается в
INT UNSIGNED
, ipv6 в 2BIGINT UNSIGNED
): это уменьшит ваши таблицы и потребует меньше ввода-вывода во время сканирования
И, в качестве примечания, даже если $_SERVER["REMOTE_ADDR"]
должно быть безопасно, НИКОГДА НЕ ЗАБЫВАЙТЕ ИЗБЕГАТЬ ДАННЫХ В SQL-ЗАПРОСАХ!
Поместите индекс в столбец ip.
В Интернете есть буквально тонны информации об анализе запросов и улучшении, поэтому я не собираюсь повторять это для вас, но индекс определенно поможет.
Я предполагаю, что security.ip
- это очень большая таблица, поэтому поиск становится медленным.
Недостаток индекса: запись становится несколько медленнее, поэтому, если вы много пишете в эту таблицу, вы можете попытаться перенести запрещающую часть в новую таблицу, скажем banned_ips
.