Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Vamos a ver 15 formas de optimizar nuestras consultas SQL. Muchas son comunes y conocidas por todos
los que nos dedicamos a esto. Otras quizá sean menos obvias y os sirvan de ayuda. Son simples
instrucciones para que el DMBS ("DataBase Management System") -o como lo llamamos en mi entorno, el
Motor de la Base de Datos- realice sus operaciones más rápido.
1.- Índices
Indexar nuestras columnas es una de las maneras más comunes y sencillas de optimizar nuestras
consultas. Sin embargo, se debe tener un profundo conocimiento sobre cómo funciona el indexado en
cada DMBS para utilizar correctamente sus índices. Dicho de otro modo: crear índices sin sentido, sencillos
o absurdos sin comprender exactamente cómo funciona nuestra Base de Datos puede tener justamente el
efecto contrario al deseado en nuestras consultas, y hacer que funcionen aún más lentas.
Esta consulta no está optimizada, ya que el motor de la Base de Datos debe buscar el valor 16, y
DESPUÉS escanear hacia delante del 16 y por detrás.
SELECT * FROM MI_TABLA WHERE COLUMNA >= 17 ;
De este modo, el DMBS debe saltar directamente a los valores mayores a 16. Es casi la misma manera,
pero evitas que el DMBS tenga que comparar también los valores menores para ver si entran en la query.
3.- Comodines
En SQL, el comodín se nos presenta con el símbolo ‘%’ (se puede ver un truco acerca de él en mi artículo
anterior Buscar el tanto por ciento (%) en un LIKE de una SELECT). Usar comodines ralentiza bastante
nuestras consultas, especialmente si la tabla en la que buscamos en bastante grande. Se pueden optimizar
dichas consultas si podemos permitirnos poner el comodín únicamente como comodín-sufijo, en vez de
como comodín-prefijo o como comodín-total.
#Comodín-total:
SELECT * FROM MI_TABLA WHERE COLUMNA LIKE '%manzana%';
#Comodín-sufijo:
SELECT * FROM MI_TABLA WHERE COLUMNA LIKE 'manzana%';
#Comodín-prefijo:
SELECT * FROM MI_TABLA WHERE COLUMNA LIKE '%manzana';
Esta columna debe estar indexada para que se aplique algo de optimización. P.D: Hacer un comodín-total
en una tabla con varios millones de registros puede suponer que tires abajo la Base de Datos.
Este sistema es muy malo, ya que el COUNT debe contar cada registro de la tabla para ver cuantos hay.
La mejor alternativa es usar el operador EXISTS, que para en cuanto encuentra el primer registro que
concuerda con la búsqueda, sin tener que contarlos todos. Por lo tanto, existe.
#MAL
SELECT * FROM MI_TABLA WHERE Substr(COLUMNA, 1, 1) = 'pepito' ; Esta consulta hará
Substr a cada registro de la tabla individualmente para rastrear el valor ‘pepito’. Pero del siguiente modo:
#MEJOR
SELECT * FROM MI_TABLA WHERE COLUMNA = 'pepito%' ; La consulta con comodín corre
No seas perezoso. Si sólo necesitas una cantidad de registros, trata de limitar el resultado. De esta forma
no sólo serás más eficaz, sino que ayudarás a minimizar el daño que puede ocasionar un ataque por SQL
de este tipo.
SELECT * FROM MI_TABLA WHERE 1 LIMIT 10 (Sólo en MySQL) ;
14.- Subquery en un IN
Muchos de nosotroso usamos una sub-consulta (o subquery) dentro de un operador IN, tal que así:
SELECT * FROM MI_TABLA WHERE COLUMNA IN ( SELECT COLUMNA2 FROM MI_TABLA2 );
Hacer esto es muy caro para el DBMS porque la consulta SQL debe evaluar la query exterior antes que la
interior. En vez de esto, podemos usar lo siguiente:
dummytable.COLUMNA2 = MI_TABLA.COLUMNA;
Usando una dummytable (o tabla tonta) es mejor que usar un operador IN para hacer una sub-consulta.
Como alternativa, un operador EXIST tambiés es mejor.
Si hacemos la query anterior usando 2 consultas con UNION, estas sí usarán sus índices.
SELECT * FROM MI_TABLA WHERE COLUMNA_1 = 'pepito'
UNION
Parar hacerlas perfectas, se requiere mucho más análisis comparativo y conocimientos más profundos
para optimizarlas a nivel máximo.