Aquí hay un par (principalmente de MySQL, pero probablemente funciona de manera similar en otros):
Usando LIMIT como filtro …
Suponga que tiene una tabla Really Big con un montón de combinaciones de búsqueda y desea las (primeras, medias o) últimas filas M en una de sus columnas. Las combinaciones de búsqueda no son para filtrar la tabla en sí, sino para buscar valores en otras tablas, probablemente para mostrar. Entonces, tienes algo como
seleccione
de bigtable b, join_tab_1 j1, join_tab_2 j2, join_tab_3 j3, …, join_tab_N jN
donde b.val1 = j1.val1 y b.val2 = j2.val2 … y b.valN = jN.valN
ORDENAR POR b.order_col
LÍMITE M;
- ¿Cuáles son los mejores consejos para un joven de 24 años sobre finanzas personales?
- ¿Cuáles son los mejores consejos para obtener el primer trabajo?
- ¿Cuáles son algunos consejos de estilo para la moda rocker chic?
- ¿Cuáles son algunos consejos para obtener buenas ofertas en tarifas de cable?
- ¿Cuáles son algunos hacks bancarios?
Esta será una consulta realmente retorcida y lenta, porque las uniones se ejecutan en toda la tabla y se proyectan antes de que ORDER BY y LIMIT puedan suceder. Además, la mayoría de los optimizadores de consultas no son lo suficientemente inteligentes como para usar un índice (si existe) en ORDER BY en order_col si hay uniones “delante de él”, por lo que no se utilizará una clasificación pasiva en un índice.
Una forma de dar lo que equivale a una sugerencia de optimizador de facto y hacer que esta consulta sea mucho más rápida es hacer algo como
seleccione
from (seleccione , b.order_col
de bigtable ORDER BY order_col LIMIT M) b,
join_tab_1 j1, join_tab_2 j2,…, join_tab_N jN
donde b.val1 = j1.val1 y b.val2 = j2.val2 … y b.valN = jN.valN
ORDER BY b.order_col;
Lo que esto hace es que obliga a las uniones a ejecutarse solo en las M filas que le interesan en comparación con toda la tabla. Además, si hay un índice en order_col, el límite de subconsulta puede usarlo, lo que significa que la ordenación “activa” solo ocurre en las filas M que le interesan (nota: todavía necesita el ORDER BY “externo” para garantizar el orden correcto). Incluso si no se puede usar una clasificación pasiva, la segunda consulta pateará el extremo de la primera consulta debido a la reducción de las búsquedas de unión, pero si se puede usar una clasificación pasiva, podría tener una consulta que se ejecute en milisegundos en lugar de horas.
Y en cuanto a MySQL específico (aunque varias otras bases de datos tienen operaciones similares):
GROUP_CONCAT para “aplanar” se une en columnas:
El poder de GROUP_CONCAT de MySQL