Php mysql查询速度慢-IP查找(禁止或不禁止)

Php mysql查询速度慢-IP查找(禁止或不禁止),php,mysql,performance,ip,Php,Mysql,Performance,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');

我的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
//index.php-所有内容都重定向到.htaccess中的此文件

在ip列上放置索引

网上有大量关于查询分析和改进的信息,所以我不想重复,但索引肯定会很有帮助

我猜
security.ip
是一个非常大的表,因此查找速度会变慢

索引的缺点是:写入速度会慢一些,因此如果您对该表写入了大量内容,可以尝试将禁止部分卸载到一个新表中,例如
banked\u ips

  • IP
    列上放置一个(唯一的?)索引
  • 通过将文本表示形式转换为“本机”表示形式来使用正确的数据类型(ipv4适合于
    INT UNSIGNED
    ,ipv6适合于2
    BIGINT UNSIGNED
    ):这将使您的表更小,并且在扫描期间需要更少的I/O

  • 另外,作为补充,即使
    $\u SERVER[“REMOTE\u ADDR”]
    应该是安全的,也不要忘记在SQL查询中转义数据

    1.1.1.1不是整数,你怎么能把INT作为数据类型?@Gino查找
    ip2long
    long2ip
    PHP函数或
    INET_ATON()
    INET_NTOA()
    MySQL函数查找起来比CHAR(20)快?@Col.Shrapnel经过一些挖掘,我发现不建议使用varchar/char进行查找,INT更好。此外,我发现使用了一系列IP,而没有查找每个IP(例如,1.1.1.1到1.1.1.255,但却>upperboundIP INT number)。所以更容易个人维护-CodeCaster有一个很好的解决方案,但我认为使用2个表作为IP不是,recommended@Col.Shrapnel这就是为什么使用适当的索引是我清单上的第一点。。。第二个问题只是一个补充(但根据我的经验,有时这种数据类型问题会导致速度大幅放缓;请参见示例。)
    // 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;
    }