Sie sind auf Seite 1von 6

20/12/13

Consejos para optimizar tus consultas (y tablas) SQL

Funcin 13

Inicio

Portafolio

Aplicaciones

Libros

Blog

Contacto

Consejos para optimizar tus consultas (y tablas) SQL


22 abril, 2013 | Publicado el: SQL 11 comentarios
Inicio Blog Programacin SQL Consejos para optimizar tus consultas (y tablas) SQL

B u s c a r . . . Hace unos das, recib un comentario en el artculo en el que se explican los JOINs de forma visual y concisa, de alguien que estaba preocupada por la optimizacin en SQL y me pareci muy interesante! Recuerdo haber hecho bastante trabajo de optimizacin en Accenture, reduciendo tiempos de carga de 40 segundos para una consulta a un par de segundos. As que, como siempre, voy a intentar compartir ese conocimiento. Ten en cuenta que hay consejos que aplican solo a la arquitectura de la base de datos, otros que solo al desarrollo de consultas, y otros que sirven para ambos casos.

Buscar

Suscrbete a nuestro RSS

Suscrbete por Email

Cuidado al disear el esquema


Antes de hacer consultas, lo primero que deberas hacer es disear el esquema y quiz es uno de los pasos ms importantes si la aplicacin. La memoria necesaria para una tabla es el nmero de entradas por el tamao de una fila ( de perogrullo ) por lo que las tablas deben tener un tamao aceptable. Es lgico que un campo nombre sea v a r c h a r pero, qu pasa con un cdigo postal que solo va a tener 5 caracteres siempre ? Veamos lo que pasa internamente: Sguenos en Twitter

Adquiere mi ltimo libro


V A R C H A R( 5 ) Almacenamiento requerido 1 byte 3 bytes

Valor

C H A R( 5 )

Almacenamiento requerido 5 bytes 5 bytes

' ' ab

' ' a b

' '

' ' ' a b '

' a b c d e '

' a b c d e '

5 bytes

' a b c d e '

6 bytes

(/codebright-es? utm_campaign=codebrightes&utm_medium=embed&utm_source=w

Como ves, a tamao completo, no tiene mucho sentido guardar un v a r c h a r de 5 caracteres teniendo en cuenta que, si siempre va a ocupar lo mximo, ocupar ms que si fuera un c h a r.

Particiona las tablas


Es bastante comn tener tablas de las que solo seleccionemos algunas columnas en concreto con asiduidad. Imagina por ejemplo la tabla de un usuario en la que podemos llegar a guardar un montn de informacin como su fecha de nacimiento, departamento al que pertenece, etc. Pero habitualmente acceders a su nombre de usuario, correo, contrasea y poco ms. Para esos casos, es buena idea particionar la tabla:

Laravel: Code Bright (ES) (/codebright-es? utm_campaign=codebrightes&utm_medium=embed&utm_source=www


Desarrollo de aplicaciones web con Ms la... informacin por Dayle Rees (/codebright-

C R E A T ET A B L Eu s u a r i o s{ i dI N Tu n s i g n e dn o tn u l la u t o _ i n c r e m e n t , u s u a r i oV A R C H A R ( 2 0 )n o tn u l l , p a s s w o r dV A R C H A R ( 4 0 )n o tn u l l , e m a i lV A R C H A R ( 4 0 ) ,

www.funcion13.com/2013/04/22/consejos-para-optimizar-tus-consultas-y-tablas-sql/

1/6

20/12/13
P R I M A R YK E Y ( i d ) } C R E A T ET A B L Ed a t o s _ u s u a r i o{ i d _ u s u a r i oI N Tu n s i g n e dn o tn u l l , i d _ d e p a r t a m e n t oI N Tu n s i g n e d , f e c h a _ n a c i m i e n t oD A T E , d n iC H A R ( 9 ) , P R I M A R YK E Y( i d _ u s u a r i o ) }

Consejos para optimizar tus consultas (y tablas) SQL

Los datos que usamos frecuentemente los mantenemos en una tabla mientras que los que usamos con menos frecuencia los dejamos en otra, esto har que la tabla menos frecuente ocupe menos memoria.

(/descubriendonodejs-express? utm_campaign=descubriendonodejsexpress&utm_medium=embed&utm_sour
Descubriendo Node.js y Express (/descubriendonodejs-express? utm_campaign=descubriendonodejs-

ndices, entre uso y abuso


Hay ndices que son bastante claros al crearlos y otros que se van viendo con las necesidades del desarrollo. Los ndices (por regla general) le indican al motor de la base de datos que esa columna se va a usar con mucha frecuencia, lo cual hace que los datos se guarden en memoria para facilitar el acceso a los datos. Recuerdo una vez un programador que me dijo, si algn da te va una consulta lenta, adele ndices a la tabla y santas pascuas ERROR! Por regla general es buena idea crear ndices sobre campos que seleccionas a menudo, agrupas, ordenas o usas joins, el contrapunto es que cada ndice ocupa un espacio proporcional al nmero de filas en la tabla. Ten cuidado!

Ultimos comentarios

Nada de SELECT *
A menudo, especialmente durante el desarrollo, nos vemos tentados a escribir S E L E C T * para cualquier consulta en la que nos traigamos datos de una tabla. Esto es un error en la mayora de las ocasiones ya que estars trayendo datos que, probablemente, no necesites. Lo que es aun peor es que la tabla puede crecer en nmero de columnas en el futuro, lo cual implica que traers aun ms datos que no necesitars. Limita las consultas a las columnas que necesites.

Xavier_Xyron Amigo, no tienes el archivo en rar o en zip ? Lo que sucede es que no consigo adaptarlo a mi proyecto, tan slo en ste en particular. Ocultando y mostrando mltiples marcadores en Google Maps 3 days ago

Encadena SELECT o usa JOIN pero no ambos


Aparte de que son menos mantenibles y legibles, tienen un alto impacto en cuanto a recursos usados. Por regla general adems, es recomendable no usar SELECTs anidados y usar nicamente JOINs ya que el rendimiento es casi siempre mejor. Recuerda que, por regla general, puedes convertir un SELECT anidado en un JOIN fcilmente: diego cruz exelente compadre Funciones tiles de MySQL (Primera parte) Fecha y Hora 3 days ago

S E L E C Tu s u a r i o F R O Mu s u a r i o s W H E R Ei dI N( S E L E C Ti d F R O Md a t o s _ u s u a r i o W H E R Ed e p a r t a m e n t o=1 )

Ahora con JOINs

S E L E C Tu s u a r i o s . u s u a r i o F R O Mu s u a r i o s I N N E RJ O I Nd a t o s _ u s u a r i oO Nu s u a r i o s . i d=d a t o s _ u s u a r i o . i d W H E R Ed a t o s _ u s u a r i o . d e p a r t a m e n t o=1 ;

Antonio Traverso Fabuloso el sistema, pero arroja un error. Cuando uno pincha el enlace de que la pgina fallar, en efecto, todos los enlaces comienzan a dar problemas. Era ese el objetivo???? O.o No lo creo.... Sencilla web con navegacin AJAX en jQuery 5 days ago

Este es un error bastante comn para los iniciados al SQL ya que la primera consulta es ms

www.funcion13.com/2013/04/22/consejos-para-optimizar-tus-consultas-y-tablas-sql/

2/6

20/12/13
natural para el programador.

Consejos para optimizar tus consultas (y tablas) SQL

Evita los filtros de texto


Una de las cosas que ms impactan sobre el rendimiento de la base de datos es el hacer bsquedas de texto en cadenas, especialmente en campos de tipo T E X T y usando % .
S E L E C Tu s u a r i oF R O Mu s u a r i o sW H E R En o m b r eL I K E' % J u a n % '

Gustavo Muchas gracias. Me ha sido de enorme utilidad. Funciones tiles de MySQL (Primera parte) Fecha y Hora 1 week ago

Esto nos dara todos los Juan Antonio, Juan Roberto, Juan Ildefonso, Juanjos, etc que tengamos en la base de datos pero el coste de la operacin es bastante elevado. Intenta evitar que tus aplicaciones realicen este tipo de operaciones. Y t, qu consejos daras para optimizar tus consultas? Recuerda que, si el artculo te pareci interesante, til o incluso equivocado, por favor considera el dejar un comentario. Lo apreciar mucho! diego Hola como estas? sabes si el marcador tiene una propiedad color? gracias Google Maps Marcadores 2 weeks ago

7
Me gusta

De inters
BuSeVici Informacin sobre autobuses y bicicletas en Sevilla desde cualquier mvil: iPhone, Android o BlackBerry Domine las aplicaciones mviles con jQuery Mobile

10
Tw ittear

Sobre el autor
Antonio Laguna
Programador Front-end en Gamesys. Trabajando con JavaScript y HTML5 desde el corazn de Londres

Hazte con la traduccin de este completo libro para aprender a usar jQuery Mobile jQuery ColorPicker Pequeo plugin para generar un selector de colores a lo Photoshop jQuery Translator Pequeo plugin que te ayudar en la traduccin de sitios webs estticos.

Entradas relacionadas
Localizador de tiendas con PHP, jQuery Mobile y MySQL Parte 2 11 marzo, 2013 Auto-actualizacin de TIMESTAMP en MySQL con triggers 26 diciembre, 2012 Explicacin visual de los JOINs de SQL 16 mayo, 2012

Entradas populares
Cmo realizar peticiones AJAX cross-domain usando JSONP y jQuery 12 abril, 2012 Ocultando y mostrando mltiples marcadores en Google Maps 8 septiembre, 2012

Resuelve tus dudas Pregunta tus dudas sobre los temas que tratamos en este Blog. Si es interesante y no ha sido tratado, quiz lo tratemos en el blog!

Categoras
Administracin (1) Apache (1) Aplicaciones web (2) CSS3 (1) Diseo (1)

Lista de elementos ordenables y editables usando HTML5, jQuery, PHP y MySQL 8 febrero, 2012

11 comentarios nete a la discusin...

Google Maps (8) HTML (10)

www.funcion13.com/2013/04/22/consejos-para-optimizar-tus-consultas-y-tablas-sql/

3/6

20/12/13

Consejos para optimizar tus consultas (y tablas) SQL

nete a la discusin...
Antiguos Comunidad
hace 8 meses

Informacin (1) JavaScript (11)


Compartir Acceder

jQuery (20) jQuery Mobile (8) MySQL (4) Noticias (14) Personal (2) PHP (12) Programacin (28) Seguridad (2) SQL (4) Tecnologa (1)

B . Let ic ia Mart nez

Hola, muy bueno el artculo. Estoy de acuerdo en el punto donde dices que se eviten los filtros de texto, pero hay veces que tienes que usar algo de ese tipo porque la informacin viene muy mal o para bsquedas acercadas o parecidas. Mi pregunta es: Sera mejor utilizar un substring o sera lo mismo que utilizar el like?? Ejemplo: SELECT desc_mens FROM cat_estatus_mensaje WHERE desc_mens LIKE 'CON%'; Cambiarlo por esto: SELECT desc_mens FROM cat_estatus_mensaje WHERE substr(desc_mens, 0, 3) = 'CON';
Responder Compartir

Busca por etiquetas


jquery jquery mobile ajax javascript php google maps html5 cache deferred prototype localStorage plugin github api twitter inheritance promise closure scope eventos promesa elated usabilidad google analytics localization navegacion ajax traduccion asincrono ebook handlebars live templating plantillas on mustache js google api html dom colorpicker contenteditable cdn jquery ui busevici jsonp photoshop css3 capa CSS formulario desarrollo web trucos cache header cabecera cache layer html5 type datetime funcion anonima timestamp mysql laravel code happy geometria distancia developer tools Google Chrome imagen cargando igual comparacion apache jqueryTranslator cross-domain peticion actualizacion evitar cache icono refrescar infowindow popup tipos marcador marker sql sql join inner join

A nt onio Laguna

M o d e ra d o r

B. Leticia Martnez hace 8 meses

Hola Leticia! En mi opinin es mejor usar substring para comparar texto completo, puedes incluso meter un ndice con ese substring si siempre vas a comparar por ejemplo los 3 primeros caracteres (como es tu caso) lo cual hara la bsqueda aun ms rpida. Por norma general, una consulta basada en texto completo es ms rpida que usar likes.
Responder Compartir

David Lpez P rez

hace 8 meses

Hola Antonio, me parece muy bueno, interesante y ameno el artculo. Gracias. Un detalle, que quiz me equivoque: Cuando dices que el varchar 'abcd' ocupa 6 bytes... no seran 5? Un saludo.
Responder Compartir

A nt onio Laguna

M o d e ra d o r

David Lpez Prez hace 8 meses

Hola David, si fuera 'abcd' estara ocupando 5 bytes lo que pasa es que deba tener hambre y me com la e... Ya est corregido y le he puesto un poco de formato para que no se borren los 5 espacios que ocurren si guardas una cadena vaca en un campo CHAR(5) Muchas gracias por avisar!
1 A na
Responder Compartir

hace 8 meses

De verdad ayudan mucho este tipo de tecnicas por debajo para una mejor respuesta de la base. Buen post, Muchas Gracias!
Responder Compartir

A nt onio Laguna

M o d e ra d o r

Ana hace 8 meses

www.funcion13.com/2013/04/22/consejos-para-optimizar-tus-consultas-y-tablas-sql/

4/6

20/12/13
1 abelinux
Responder Compartir

Consejos para optimizar tus consultas (y tablas) SQL

Muchsimas gracias Ana! Me alegra saber que el artculo es de ayuda :)

hace 8 meses

Yo hago a menudo lo siguiente $sql=mysql_query("select * from tabla",$conexion1); while($row=mysql_fetch_array($sql)){ $sql2=mysql_query("select * from tabla2 where campo=$row[0]",$conexion2); $row2=mysql_fetch_array($sql2); } Se que est mal hacerlo porque la solucin mas obvia es dejarlo en una consulta, pero con esto he logrado traer datos de bases diferentes o inclusive servidores diferentes ya q cada SQL permite especificar una conexin diferente. No lo hagan a menos que no tengan muchos datos.
Responder Compartir

A nt onio Laguna

M o d e ra d o r

abelinux hace 5 meses

Eso no es nada recomendable, pero nada nada nada. Te arriesgas a sobrecargar el programa en menos que canta un gallo.
Responder Compartir

ruben

hace 5 meses

muy bueno... (Y)


Responder Compartir

Maria Jos e Diaz

hace 4 meses

Gracias por el articulo me ha ayudado mucho...!! :)


Responder Compartir

y oc men

hace 4 meses

Realmente interesante este artculo, una de las grandes dudas cada vez que realizo un proyecto web esta justamente es esas bsquedas de texto, por ejemplo si tengo la tabla usuarios y tiene un campo nombre, otro apellido y nombre de usuario, para realizar una bsqueda que me coincida el nombre el apellido o el nombre de usuario, como debera de realizarla? con subtring lo intente una vez pero no me resulto o no supe implementarla ya que debes indicar la cantidad de caracteres a cotejar y si busco a todos los manuel y le pongo por ejemplo 3 conseguira a todos los man, pero si coloco por ejemplo ma no me funcionaba tampoco como quera, entonces que me recomendaras para este tipo de bsquedas? muchas gracias desde ya por toda la ayuda que aportas.
Responder Compartir

TAMBIN EN FUNCIN 13

Q U E S E S T O ?

Ya disponible la tercera edicin en castellano de Domine las


7 comentarios hace 11 meses

jQuery 1.9 ya est entre nosotros


3 comentarios hace 11 meses

A lex ander Gracias Antonio por

Noe Hola, primero que todo excelente

pagina, me saco de varios problemitas, ahora la pregunta me intereso el libro

contestar. Seguir pendiente y felicitaciones por la pgina, me apoyo

Novedades visuales en Google Maps


Un comentario hace 7 meses

Me uno a gamesys
4 comentarios hace 9 meses

Jes us Crea que haba dejado un

A nt onio Laguna Hola juan, Me alegra

comentario pero no lo veo. Lo habr hecho mal. Lo dejo otra vez.Deca que

saber que tienes grandes aspiraciones. En esta vida hay que pelearla para

Su s crb e te

A a d e D i s q u s a tu s i ti o w e b

www.funcion13.com/2013/04/22/consejos-para-optimizar-tus-consultas-y-tablas-sql/

5/6

20/12/13

Consejos para optimizar tus consultas (y tablas) SQL

Ultimos posts
Un programador en Londres 9 octubre, 2013

En contacto

Envanos un correo
Nombre * Email *

Code Bright para Laravel 4, ya disponible en castellano 6 agosto, 2013 No te pierdas jQuery Plugin Registry #jqueryIO! 26 junio, 2013

Enviar

Copyright 2011 F uncion13.com.

IN IC IO

SER VIC IOS

POR TAFOL IO

BL OG

C ON TAC TO

www.funcion13.com/2013/04/22/consejos-para-optimizar-tus-consultas-y-tablas-sql/

6/6