10 tips para Optimizar consultas MySQL

baluart10 Abril 2007 - 8:49am 16 comentarios
Enviar por Email Imprimir

En Jaslabs han publicado un interesante listado de consejos y tips para optimizar las consultas MySQL. Aquí las traducimos y ampliamos.

Rapidez y Performance

1. Usar el comando Explain

El comando Explain explica como se lleva a cabo una consulta SELECT, como se usan los índices y como se unen las tablas. La forma de utilizarlo es la siguiente:

Explain select * from tabla

Ahora, en lugar de ejecutar la consulta, se mostrará un listado con la información ya mencionada anteriormente. Esto es muy útil para optimizar las consultas. Más información.

2. Usar permisos poco complejos

Por defecto, el usuario que utilizamos para conectar nuestra aplicación a la Base de datos, goza todos los permisos MySQL. Sin embargo, el utilizar un usuario con sólo los permisos necesarios (para la publicación, por ejemplo), permiten a MySQL reducir la comprobación de cada uno de los permisos, cada vez que el cliente MySQL ejecute las sentencias (INSERT, por ejemplo).

3. Hacer BENCHMARK() a nuestras expresiones

Si tenemos un problema de rendimiento con una expresión que ya hemos identificado, una excelente manera de comprobar su optimización es utilizando la función benchmark(). Su sintaxis es la siguiente:

BENCHMARK(loop_count,expression)

Esta función siempre devuelve un valor cero, pero además imprime el tiempo que se ha demorado en el cliente final (no el tiempo de CPU en el servidor). Más información.

4. Optimizar la cláusula WHERE

Estos son algunos consejos para optimizar WHERE:

  • Remover los paréntesis innecesarios. Por ejemplo: DE (a<b AND b=c) AND a=5 A b>5 AND b=c AND a=5. Más información.
  • COUNT(*) esta optimizado para devolver un SELECT de manera mucho más rápida, siempre y cuando sea a una tabla y sin usar WHERE. Por ejemplo: SELECT COUNT(*) FROM tabla
  • La opción SQL_SMALL_RESULT, puede usarse con GROUP BY o DISTINCT para indicar que el conjunto de resultados es pequeño. En este caso, MySQL utiliza tablas temporales muy rápidas para almacenar la tabla resultante en lugar de usar ordenación.

5. Utilizar la sentencia OPTIMIZE TABLE

OPTIMIZE TABLE debe usarse si se ha eliminado gran parte de la tabla o si se han hecho varios cambios en la misma. Optimize Table desfragmenta la tabla, la repara y la ordena. Más información.

6. Evitar los tipos de columna de longitud variable

Los campos con longitud fija (CHAR, por ejemplo) son más rápidos que los de longitud variable (VARCHAR, por ejemplo). Pero, como contrapartida, ocupan más espacio en disco. Aún así, para las tablas MyISAM, se recomienda evitar el uso de las columnas de longitud variable (VARCHAR, BLOB, and TEXT).

7. Insert Delayed

Se recomienda utilizar INSERT DELAYED cuando los clientes no pueden esperar a que el INSERT se complete ó cuando no sea necesario conocer que los datos han sido escritos correctamente.

Cuando se usa INSERT DELAYED, se obtiene una confirmación inmediata por parte del servidor. La data se almacena en una cola para ser insertada cuando la tabla no esté en uso por ningún otro proceso. Además, los INSERT en cola son agrupados en bloques lo que aumenta la rapidez de su ejecución.

8. Priorizar las sentencias

Aquí explicamos dos maneras:

  • Utilizar INSERT LOW_PRIORITY en los INSERT, cuando se desee priorizar las consultas SELECT sobre las INSERT. El INSERT debe esperar hasta que no hayan otros clientes leyendo la tabla.
  • Utilizar SELECT HIGH_PRIORITY en los SELECT, para priorizarlos sobre cualquier otro comando que se ejecute simultáneamente, ya sea para añadir o actualizar datos en la tabla.

9. Insertar filas múltiples

Es recomendable ejecutar un insert multiple a varios inserts distintos. La sintaxis es:

INSERT INTO table (col1, col2) VALUES ('value1', 1), ('value2', 2), ('value3', 3)

10. Sincronizar tipos de datos

La idea es la siguiente. Si se tienen columnas que van a almacenar la misma información, pero están en distintas tablas, es aconsejable que sean del mismo tipo de datos. De esta manera, los JOINS que se ejecuten entre ellas, serán mucho más rápidos.

Comentarios

Imagen de CalinSoft.net
Imagen de Balu

CalinSoft, lee la primera linea. :P

Imagen de facundo
facundo

jaja calinsoft, te taparon la boca!, jaja

Imagen de  CalinSoft.net
CalinSoft.net

yo que recuerden aqui es la pagina donde reclaman que se citen las fuentes , facundo, cuando sepas lo que yo se hablame

Imagen de elmer
elmer

Encima de que eres picon haces spam con tu nombremi querido calinsoft..Y leete el articulo completo..desde la primera linea 

Imagen de Antonio Michel

Luego luego se nota que hay gente que no le agrada que a otros les vaya bien, eso es pura envidia.

Imagen de Antonio Michel

Por cierto a mi me sirvio mucho la traduccion, muchas gracias!Y seguiremos visitandolos!y olviden al idiota ese de Calinsoft

Imagen de edison andres
edison andres

es tas super 

Imagen de enoku
enoku

muchas gracias Balú, por la traduccion.. esta muy buena, y por personas como tu hay personas que adquirimos mas conocimientos y claro compartirlo como nos lo fue compartido...

personas como calinsoft por favor en vez de criticar sin bases ni razon, sigan el ejemplo de Balú o ni se aparezcan por acá.

Imagen de SirChokolate
SirChokolate

Felicidades por esta traduccion, esta muy buena y es de mucha utilidad.

Imagen de Richard

Tengo 5 millones de registros en una tabla con solo 2 campos (id, valor) y estoy tratando de eliminar valores duplicados (emails), pero MySQL demora mucho en ejexutar la siguiente consulta:

INSERT INTO contactos_temp (id_usuario, email)
SELECT c.id_usuario, c.email
FROM contactos AS c
WHERE c.id_contacto > 0 AND c.id_contacto <= 1000000
GROUP BY c.email ASC

Esa consulta solo me trata 1 millón de registros, pero me tarda mas de 1 minuto :S
Si lo hago con 1.5 Millones me tarda: 245.7058 seg
Si lo hago con 2 millones no termina nunca :(

Mierda!! :S Vaya lentitud...

Pregunta: ¿Obtendría mejores resultados si lo hago con otro sistema gestor de base de datos?

http://cleptomano.com/musica/ << Música Online y mas :)

Imagen de FestaMajor.biz

Me ha ido bien para la página. me taravan 1,4 segundos las consultas.

Por suerte sólo he utilizado el primer punto.

Me he dado cuenta que debia faltar algun indice, lo he creado y ahora tarda 0,07 segundos.
Mi web: Festes de Catalunya

Imagen de FotoPex

Excelente, me sirvió mucho, suerte!

Imagen de actividades solteros
Imagen de Rosendo Antonio
Rosendo Antonio

Es un artículo interesante, ha sido un gran aporte me ha servido de mucho,Felicidades al que haya traducido.

Imagen de Jose Alejandro Realza

Tutoriales

Cómo descargar videos de VK.com
En este artículo voy a explicar como descargar videos y películas...
Descargar Facebook Móvil Gratis
Por si aún no lo han hecho, es posible descargar Facebook Móvil...
Cómo generar tráfico web con las redes sociales - Paso a Paso
Muchas empresas están publicando contenidos como la forma de crear...

Artículo Recomendado

3 Tips cruciales para recuperar archivos eliminados
¿Te imaginas perder el trabajo de toda una semana en tan solo unos segundos? Todos hemos pasado por este problema. Quizás eliminamos por error un archivo importante o lo borramos sin pensar que era valioso para otro... más