2011-11-02 97 views
16

我在我的PHP文件中检查IP是否被禁止的功能。出于某种原因,我的网站速度很慢,问题是我检查IP是否被禁止。mysql查询速度慢--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秒。为什么?我没有离开连接或其他表格。

谢谢

回答

26
  1. 将一个(唯一?)指数在IP
  2. 使用正确的数据类型由文本表示转换为“本地”一个(一个IPv4镶嵌在INT UNSIGNED,在2 BIGINT UNSIGNED一个IPv6):这会让你的表更小,并且扫描

期间将需要较少的I/O,并作为一个侧面说明,即使$_SERVER["REMOTE_ADDR"]应该是安全的,永远不要忘记逃避SQL查询数据!

+0

1.1.1.1不是一个整数,你怎么能有INT作为数据类型? –

+0

@Gino查找'ip2long'和'long2ip' PHP函数或INET_ATON()和INET_NTOA()MySQL函数 – CAFxX

+0

INT比查找的CHAR(20)快吗? –

2

把一个索引放在ip列上。

在查询分析和改进方面,网上有大量的信息,所以我不会为你重复这些,但索引最能帮助你。

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

索引的缺点:写入速度变慢,所以如果你写了很多这个表,你可以尝试卸载禁止部分到一个新表,比如banned_ips