20 mejores prácticas para MySQL

by manelgarcia on November 28, 2009

in Tutoriales

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";

Leave a Comment

Previous post:

Next post: