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

时间:2011-11-02 11:08:03

标签: 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');
}
// 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 个答案:

答案 0 :(得分:26)

  1. IP
  2. 上添加(唯一?)索引
  3. 使用正确的数据类型,将文本表示转换为“本地”表示(ipv4适合INT UNSIGNED,ipv6合2 BIGINT UNSIGNED):这会使您的表变小,并且会扫描期间需要较少的I / O
  4. 并且,作为旁注,即使$_SERVER["REMOTE_ADDR"]应该是安全的,也不要忘记在SQL查询中撤消数据!

答案 1 :(得分:2)

在ip列上放一个索引。

网上有很多关于查询分析和改进的信息,所以我不会为你重复这些信息,但索引最明确的帮助。

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

索引的缺点:写入变得有点慢,所以如果你在该表中写了很多东西,你可以尝试将禁止部分卸载到新表中,比如banned_ips