2011-11-02 5 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. 「ネイティブ」1(IPv4のがINT UNSIGNEDに収まる、2 BIGINT UNSIGNEDでのIPv6)にテキスト表現を変換することにより、正しいデータ型を使用して上の(ユニーク?)のインデックスを置きます:これはあなたのテーブルが小さくなり、スキャン

と、サイドノートとして中に以下のI/Oが必要になります、$_SERVER["REMOTE_ADDR"]は安全であるべき場合でも、は、SQLクエリ内のデータを逃れるために決して忘れません!

+0

1.1.1はインターガーではありません。どのようにデータ型としてINTを使用できますか? –

+0

@Ginoルックアップの 'ip2long'と' long2ip' PHP関数、 'INET_ATON()'と 'INET_NTOA()' MySQL関数 – CAFxX

+0

INTはルックアップの方がCHAR(20)より高速ですか? –

2

インデックスをipカラムに追加します。

クエリ分析と改善のためにウェブ上に文字通りたくさんの情報がありますので、私はあなたのためにそれを繰り返すつもりはありませんが、インデックスが最も確かに役立ちます。

security.ipは非常に大きなテーブルなので、ルックアップは遅くなります。

インデックスの欠点:やや遅くなるので、テーブルにたくさん書き込むと、禁止部分を新しいテーブル、たとえばにオフロードすることができます。

関連する問題