mysql 查询速度慢 - IP 查找(禁止与否)

2022-08-31 00:48:42

我的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 秒才能运行。为什么?我没有左联接或其他表。

谢谢


答案 1
  1. 在列上放置一个(唯一的?)索引IP
  2. 通过将文本表示形式转换为“本机”表示形式(ipv4 适合 a ,ipv6 in 2),使用正确的数据类型:这将使表更小,并且在扫描期间需要较少的 I/OINT UNSIGNEDBIGINT UNSIGNED

而且,作为旁注,即使应该是安全的,也永远不要忘记在SQL查询中转义数据!$_SERVER["REMOTE_ADDR"]


答案 2

在 ip 列上放置一个索引。

网络上有大量关于查询分析和改进的信息,所以我不打算为你重复这一点,但索引肯定会有所帮助。

我猜是一个非常大的表,所以查找变得很慢。security.ip

索引的缺点:写入速度会变慢,因此,如果您向该表写入了大量内容,则可以尝试将禁止部分卸载到新表中,例如。banned_ips


推荐