7.1 Razones para la aparición de índices
Otra cosa importante sin la cual no puede haber bases de datos son los índices.
Imagine una situación en la que hay 10 millones de usuarios en la tabla de usuarios y desea mostrar a todos los que tienen un nivel superior a 90. Esta consulta es muy simple de escribir:
SELECT * FROM user WHERE level > 90
Genial, escribimos la solicitud en menos de un minuto. ¿Y cuánto tiempo llevará ejecutar esta consulta desde el servidor SQL? Para ejecutar una consulta de este tipo, tendrá que pasar por 10 millones de registros, e incluso si solo hay un registro, llevará mucho tiempo.
¿Cómo haríamos una tarea similar en Java? Primero ordenaríamos la colección de usuarios por nivel, y luego podríamos encontrar muy rápidamente los registros necesarios mediante una búsqueda binaria. Espero no tener que explicar qué es.
Genial, pero ¿y si ahora necesitamos seleccionar usuarios cuya fecha de registro fue anterior a 2020? Ordene nuevamente por fecha de registro y use la búsqueda binaria.
Sí, si realizamos un filtro en algún campo, y no solo una vez, sino con frecuencia, entonces será muy útil almacenar los datos ordenados por este campo.
¿Y cómo almacenar datos ordenados simultáneamente por diferentes campos?
Y la respuesta es muy simple: no necesita almacenar los datos en sí, sino sus índices en alguna tabla global.
Digamos que hay 10 usuarios con id: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
.
Y decide ordenarlos por nivel, entonces la matriz de su id será, por ejemplo, así: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}
.
Y si los ordenamos por fecha, obtenemos, por ejemplo: {10, 1, 8, 7, 2, 3, 5, 9, 6}
.
Las matrices de estos id se denominan índices . Los elementos en sí son grandes, no los tocamos. En Java, no tocamos objetos, sino que almacenamos sus referencias; en SQL, no tocamos cadenas reales, sino que almacenamos sus números.
Déjame reescribir esto en código Java:
List<String> list = List.of("A", "C", "B", "Z", "Cc", "Bb", "Zz", "Y"); //this is a list of objects
List<String> alphabeticsList = new ArrayList(list);
Collections.sort(alphabeticsList); //collection sorted alphabetically
List<String> lengthList = new ArrayList(list);
Collections.sort(lengthList, lengthComparator); //collection sorted by string length
Ordenar colecciones no significa mover los elementos reales. La colección no almacena objetos reales, sino enlaces a ellos. Lo mismo es cierto para las tablas SQL. Las líneas reales se mienten a sí mismas y mienten.
Y cuando necesitamos hacer selecciones frecuentes para algún campo, agregamos otro índice a la tabla (análogo a una nueva colección en Java) y ordenamos las filas de la tabla, almacenamos su orden en un archivo de índice especial.
Espero que la comparación de Java haya ayudado un poco. Un poco de práctica, y para usted, el uso de índices también se convertirá en la solución más obvia.
7.2 Agregar índices a una tabla
El índice se puede especificar inmediatamente durante la creación de la tabla o se puede agregar después. Lo más frecuente es que ocurra el segundo escenario: se agregan índices a medida que crece el tamaño de la tabla y se ralentiza el muestreo de datos.
Agregar un índice a una tabla es muy simple:
ALTER TABLE table
ADD INDEX index_name (column);
Si suele buscar registros en varias columnas al mismo tiempo, puede especificar un índice compuesto: SQL usa varias columnas para componerlo.
Agregar un índice compuesto a una tabla también es muy simple:
ALTER TABLE table
ADD INDEX index_name (column 1, column 2, column 3, ...);
Los índices ocupan mucho espacio en disco, por lo que si ya no necesita un índice, siempre puede eliminarlo:
ALTER TABLE table
DROP INDEX index_name;
Los propios índices son una parte bastante oculta de la base de datos. No afectan el formato de escribir consultas de ninguna manera. Es solo que su presencia acelera el muestreo de datos y ralentiza su adición y copia de seguridad.
Pero teniendo en cuenta lo importante que es la velocidad en el mundo actual y lo barato que es el espacio en disco, no dude en añadir índices para todas las ocasiones. Perdonadme administradores...