10 consejos sql para acelerar tu base de datos

4
10 consejos SQL para acelerar tu Base de datos 29 marzo, 2010 by César 5 0 1 0 72 Share La mayoría de sitios en la Web depende de una o varias Bases de datos, ya sean para consultar, ingresar, borrar registros. Y en todas es necesaria la optimización para el aceleramiento y ahorrar recursos de nuestro Servidor, este articulo trae 10 consejos muy útiles para optimizar y acelerar nuestras bases de datos. 1. Optimizar las consultas con el Cache de Consultas SQL Utilizando la función date de PHP podemos consultar en el cache de la base de datos: $today = date("Y-m-d"); $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'"); 2. No olvidar agregar índices a los campos Esto acelerara considerablemente sus consultas a la base de datos, para ver si olvido poner índice en algunos campos puede utilizar EXPLAIN, colocándolo delante de la consulta SQL. EXPLAIN SELECT ... FROM usuarios u JOIN comentarios c ON u.id=c.usuario_id 3. Utilizar LIMIT 1 para obtener una única fila Cuando sabemos que nuestra consulta nos devolverá solo un registro, por ejemplo al consultar por un id de usuario, es recomendable utilizar LIMIT 1, esto hará que cuando el registro sea encontrado, ya no recorrerá las demás filas para comparar. $rs = mysql_query("SELECT 1 FROM user WHERE id = '1' LIMIT 1"); 4. Agregar índice a los campos de búsqueda

Upload: fernando-ordonez

Post on 16-Sep-2015

221 views

Category:

Documents


0 download

DESCRIPTION

La aceleracion de nuestra base de datos es el objetivo primordial para un servicio eficiente de consulta y gestion.

TRANSCRIPT

10 consejos SQL para acelerar tu Base de datos29 marzo, 2010by Csar 501072ShareLa mayora de sitios en la Web depende de una o varias Bases de datos, ya sean para consultar, ingresar, borrar registros. Y en todas es necesaria la optimizacin para el aceleramiento y ahorrar recursos de nuestro Servidor, este articulo trae 10 consejos muy tiles para optimizar y acelerar nuestras bases de datos.1. Optimizar las consultas con el Cache de Consultas SQLUtilizando la funcin date de PHP podemos consultar en el cache de la base de datos:$today = date("Y-m-d");$r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");2. No olvidar agregar ndices a los camposEsto acelerara considerablemente sus consultas a la base de datos, para ver si olvido poner ndice en algunos campos puede utilizar EXPLAIN, colocndolo delante de la consulta SQL.EXPLAIN SELECT ...FROM usuarios uJOIN comentarios c ON u.id=c.usuario_id3. Utilizar LIMIT 1 para obtener una nica filaCuando sabemos que nuestra consulta nos devolver solo un registro, por ejemplo al consultar por un id de usuario, es recomendable utilizar LIMIT 1, esto har que cuando el registro sea encontrado, ya no recorrer las dems filas para comparar.$rs = mysql_query("SELECT 1 FROM user WHERE id = '1' LIMIT 1");4. Agregar ndice a los campos de bsqueda

Al tener en una tabla, campos con los que hacemos bsqueda, es bueno que esos campos sean ndices para acelerar la consulta.5. Utilizar el mismo tipo de columnas para los JOINCuando relacionamos tablas tenemos que agregar ndices, luego de esto asegurarnos que los dos campos tengan el mismo tipo de dato(DECIMAL, INT, etc.). Ya que esto afectara a procesos y operaciones internas de MySQL. $r = mysql_query("SELECT company_name FROM users LEFT JOIN companies ON (users.state = companies.state) WHERE users.id = $user_id");6. No utilizar el ORDER BY RAND()Si queremos sacar un registro de una tabla aleatoriamente, es mejor sacar el valor por cdigo PHP, ya que al utilizarRAND()en MySQL estaremos llamando a la funcin por cada registro en la tabla para obtener un resultado.// mal$r = mysql_query("SELECT username FROM user ORDER BY RAND() LIMIT 1");

// bien

$r = mysql_query("SELECT count(*) FROM user");$d = mysql_fetch_row($r);$rand = mt_rand(0,$d[0] - 1);

$r = mysql_query("SELECT username FROM user LIMIT $rand, 1");7. Evitar utilizar el SELECT *Traer toda la data es casi siempre innecesario y hace procesar ms al motor de base de datos, es muy recomendable cambiar el habitual * por los campos necesarios.// mal$r = mysql_query("SELECT * FROM user WHERE user_id = 1");$d = mysql_fetch_assoc($r);echo "Welcome {$d['username']}";

// bien$r = mysql_query("SELECT username FROM user WHERE user_id = 1");$d = mysql_fetch_assoc($r);echo "Welcome {$d['username']}";8. Utilizar NOT NULLA menos que tengas buenas razones para poner NULL a un campo, trata siempre de evitar esto y colocarlas con NOT NULL, ya que este tipo de columnas (NULL) requieren de un espacio adicional y de una complejidad interna en las sentencias de comparacin9. Guardar direcciones IP en campos UNSIGNED INTMuchos de los desarrolladores (me incluyo) guardamos las direcciones IP en un campo VARCHAR sin saber que las podemos almacenar en campos INT que tiene solo 4 bytes de espacio, tenemos que asegurarnos que el campo sea UNSIGNED INT para aceptar valores ms altos, ya que la direccin IP utiliza el rango de 32 bit.Para transformar las IP a campo numrico y viceversa podemos utilizar funciones MySQL y PHP.

//mysql$r = "UPDATE users SET ip = INET_ATON('{$_SERVER['REMOTE_ADDR']}') WHERE user_id = $user_id";

//php$ip_num = ip2long($_SERVER['REMOTE_ADDR']);$ip_normal = long2ip($row['ip_address']);10. Evitar ejecutar consultas dentro de buclesUn claro ejemplo es al actualizar una serie de filas en la BD, esto se podra resumir en una sola consulta para optimizar recursos en nuestro servidor.PHPforeach ($display_order as $id => $ordinal) { $sql = "UPDATE categories SET display_order = $ordinal WHERE id = $id"; mysql_query($sql);}MySQLUPDATE categories SET display_order = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 ENDWHERE id IN (1,2,3)