En nettuts han colgado un interesante post de Burak Guzel dónde explica las 20 mejores practicas en MySQL. No las voy a traducir todas, sólo las que a mi me parece son más útiles o las que más “me paso por el foro”.
- LIMIT 1 Cuando sólo vas a sacar una línea. Muchas veces nos pasa que de entrada ya sabemos que sólo vamos a sacar 1 fila de nuestra consulta. Añadiendo LIMIT 1 forzamos a MySQL a parar y así no recorrer la tabla entera.
// tengo algun usuario en Badalona? // que NO hacer: $r = mysql_query("SELECT * FROM usuarios WHERE localidad = 'Badalona'"); if (mysql_num_rows($r) > 0) { // ... } // Mucho mejor: $r = mysql_query("SELECT 1 FROM usuarios WHERE localidad = 'Badalona' LIMIT 1"); if (mysql_num_rows($r) > 0) { // ... } - NO uses ORDER BY RAND(). Dice Burak que utilizar RAND() es un grave error ya que MySQL usa mucha potencia con esta función. Y con el aumento de datos en nuestra base de datos se puede crear un embudo. Nos propone una solución alternativa:
// que NO hacer: $r = mysql_query("SELECT nombre FROM usuarios ORDER BY RAND() LIMIT 1"); // Mucho mejor: $r = mysql_query("SELECT count(*) FROM usuarios"); $d = mysql_fetch_row($r); $rand = mt_rand(0,$d[0] - 1); $r = mysql_query("SELECT nombre FROM usuarios LIMIT $rand, 1");
- Evita el SELECT *. A más datos en nuestra base de datos, más lenta se ejecutará la consulta. Comenta que es un buen habito especificar que campos queremos en cada SELECT que usamos.
// no es preferible hacer eso $r = mysql_query("SELECT * FROM usuarios WHERE id = 1"); $d = mysql_fetch_assoc($r); echo "Bienvenido {$d['nombre']}"; // mucho mejor: $r = mysql_query("SELECT nombre FROM usuarios WHERE id = 1"); $d = mysql_fetch_assoc($r); echo "Welcome {$d['nombre']}"; // las diferencias son mucho más notables con muchos datos en la base de datos
- Usa casi siempre un campo id: Siempre que puedas usa un campo id que sea la PRIMARY KEY y se autoincremente. Aunque en nuestra tabla tengamos un campo único ‘username’ los STRINGS siempre son más lentos que los INT.
- Usa ENUM en lugar de VARCHAR: Las columnas tipo ENUM son muy rápidas y compactas. Internamente están interpretadas cómo TINYINT pero podemos guarder dentro cadenas de texto. Es muy útil para campos que sabemos de entrada que contienen pequeño texto tipo : estado (pendiente, activo, inactivo..)
- Evita los campos NULL: si te da igual tener un campo vacío que NULL, usa siempre NOT NULL. En MySQL NULL require un espacio adicional.
- Guarda las IP’s cómo UNSIGNED INT: Muchos programadores usan un VARCHAR (15) para guardar las IP’s pero deben saber que guardarlos cómo INT requiere mucho menos espacio (4kb). Para guardar y devolver IP’s como INT en MySQL podemos usar las siguientes funciones: INET_ATON() y INET_NTOA() muy parecidas a las funciones php ip2long() y long2ip().
$r = "UPDATE usuarios SET ip = INET_ATON('{$_SERVER['REMOTE_ADDR']}') WHERE id = $id";



