медленный запрос 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 секунд. Почему? У меня нет левого соединения или других таблиц.

Спасибо

Author: Gino Sullivan, 2011-11-02

2 answers

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

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

 26
Author: CAFxX, 2011-11-02 18:56:26

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

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

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

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

 2
Author: CodeCaster, 2011-11-02 11:10:11