2011-11-02 16 views
16

Ho sul mio file PHP una funzione che controlla se un IP è bannato o meno. Per qualche ragione il mio sito è molto lento e il problema è quando controllo se l'IP è bannato o meno.mysql Query slow - Ricerca IP (vietata o meno)

(tolgo il codice che controlla e il mio sito è stato veloce di nuovo)

Ecco il mio codice:

// 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 

Ecco la mia funzione

// 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; 
} 

Questa query richiede circa 2 secondi per 3 secondi per correre. Perché? Non ho lasciato join o altri tavoli.

Grazie

risposta

26
  1. Mettere un indice (unico?) Sulla colonna IP
  2. Utilizzare il corretto tipo di dati convertendo la rappresentazione testuale ad uno "nativo" (un IPv4 si inserisce in un INT UNSIGNED, un IPv6 in 2 BIGINT UNSIGNED): questo renderà il vostro tavoli più piccoli, e richiederà meno di I/O durante le scansioni

e, come nota a margine, anche se $_SERVER["REMOTE_ADDR"] dovrebbe essere sicuro, mai dimenticare PER SFUGGIRE I DATI iN query SQL!

+0

1.1.1.1 non è un interger, come si può avere INT come tipo di dati? –

+0

@Gino ricerca le funzioni PHP 'ip2long' e' long2ip' o le funzioni 'INET_ATON()' e 'INET_NTOA()' MySQL – CAFxX

+0

INT è più veloce di CHAR (20) per la ricerca? –

2

Inserire un indice nella colonna ip.

C'è letteralmente un'infinità di informazioni sul Web sull'analisi delle query e sul miglioramento, quindi non lo ripeterò per te, ma un indice sarà sicuramente di aiuto.

Immagino che security.ip sia una tabella molto grande, quindi la ricerca diventa lenta.

Lo svantaggio di un indice: la scrittura diventa un po 'più lenta, quindi se si scrive molto su quella tabella, si potrebbe provare a scaricare la parte di divieto in una nuova tabella, ad esempio banned_ips.