2011-11-02 8 views
16

Tengo en mi archivo PHP una función que verifica si una IP está prohibida o no. Por alguna razón, mi sitio es muy lento y el problema es cuando verifico si la IP está prohibida o no.mysql Consulta lenta - Búsqueda de IP (prohibida o no)

(elimino el código que comprueba y mi sitio era rápido de nuevo)

Aquí está mi código:

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

aquí es mi función

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

Esta consulta dura aproximadamente 2 segundos para 3 segundos para ejecutar. ¿Por qué? No me queda join u otras tablas.

Gracias

Respuesta

26
  1. Ponga un índice (único?) En la columna de la IP
  2. Uso del tipo de datos correcta mediante la conversión de la representación textual de una "nativa" (una dirección IPv4 cabe en un INT UNSIGNED, un IPv6 en 2 BIGINT UNSIGNED): esto hará que sus tablas más pequeñas, y requerirá menos de e/S durante los análisis

y, como nota al margen, incluso si $_SERVER["REMOTE_ADDR"] debe ser seguro, nunca se olvide de ESCAPE DE lOS DATOS eN consultas SQL!

+0

1.1.1.1 no es un interger, ¿cómo se puede tener INT como tipo de datos? –

+0

@Gino busca las funciones PHP 'ip2long' y' long2ip' o las funciones 'INET_ATON()' y 'INET_NTOA()' MySQL – CAFxX

+0

INT son más rápidas que CHAR (20) para la búsqueda? –

2

Pon un índice en la columna de la IP.

Hay literalmente toneladas de información en la web sobre el análisis de consultas y la mejora, así que no voy a repetir eso para ti, pero un índice será muy útil.

Creo que security.ip es una tabla muy grande, por lo que la búsqueda se vuelve lenta.

El inconveniente de un índice: la escritura se vuelve algo más lenta, por lo que si escribe mucho en esa tabla, puede intentar descargar la parte de prohibición a una nueva tabla, digamos banned_ips.

Cuestiones relacionadas