Indexación de una base de datos

12

No estoy tan familiarizado con las bases de datos y ahora estoy tratando de entender el mecanismo de indexación.

Por lo que sé, en un RDBMS, la indexación en una columna agiliza la búsqueda por esa columna. Esto también es cierto para las tiendas triples, solo allí los índices suponen que buscará (por ejemplo) principalmente por el sujeto, luego por objeto, etc.

No estoy seguro acerca de RDBMS, pero en las tiendas triples puede definir más de un índice, permitiendo que la tienda elija el mejor índice para cada consulta (espero haberlo entendido bien). Naturalmente, aparece la siguiente pregunta:

¿Por qué no debería agregar todos los índices posibles a una tienda triple y, extendiéndome a un RDBMS, por qué no hacer índices en cada columna (suponiendo que no soy demasiado vago)?

Dragos
fuente

Respuestas:

25

Porque, esencialmente, un índice es una tabla adicional, donde la clave principal es el campo que está indexando y el único contenido es la clave principal de su tabla principal. Por lo tanto, cada actualización debe replicarse en cada índice que use el campo que actualiza.

Esto es particularmente notable en los insertos. Imagínese si cada inserción que hiciera en una tabla tuviera que replicarse en otras 20 tablas. Va a ser dolorosamente lento.

Tenga en cuenta que esto empeora aún más con los índices compuestos, agrupados y de texto completo, pero todavía no quiero complicar el problema.

pdr
fuente
2

Los índices son básicamente estructuras de datos adicionales que deben construirse y almacenarse. La creación de inde desperdicios de energía de la CPU (durante las operaciones de escritura) y el almacenamiento desperdician la capacidad del disco.

¿Por qué querrías construir y almacenar índices que nunca usas?

Matěj Zábský
fuente
Es una pregunta puramente teórica ("qué pasa si / por qué no").
Dragos
@Dragos Creo que la respuesta a esas preguntas es obvia en mi publicación: si lo hiciera, cada operación de escritura sería mucho más lenta y cada registro desperdiciaría mucha capacidad de disco. Por qué no? Porque la potencia de la CPU y el almacenamiento en disco son caros.
Matěj Zábský
2

Solo coloque índices cuando sea necesario. Como regla general, cuando estoy desarrollando un esquema de base de datos, cada tabla obtiene un índice agrupado de clave primaria PK para comenzar. Este será el identificador único para los datos en esa tabla. En puede estar en 1 columna o muchas.

Después de eso, generalmente solo agrego índices únicos no agrupados en la (s) columna (s) en las que deseo aplicar la unicidad.

Este es el esquema base. A medida que la aplicación se desarrolla y madura, agregamos índices según sea necesario en función de los problemas de rendimiento y la forma en que consultamos los datos.

Cada índice agregado aumenta el espacio utilizado, además de agregar mantenimiento adicional. Así que elige tus índices sabiamente.

Jon Raynor
fuente
Mientras leía su respuesta, otra pregunta apareció en mi mente: ¿las claves primarias generalmente se indexan automáticamente, o tengo que especificar que se indexarán? Digamos, por ejemplo, en una base de datos MySQL?
Dragos
Sí, una clave primaria debería crear un índice agrupado automáticamente para su (SQL Server). Solo una clave primaria, por lo tanto, solo un índice agrupado por tabla. MySQL debería ser similar, pero quizás un experto en MySQL pueda validarlo.
Jon Raynor
2

La fortaleza de los índices es que son 1) una estructura de datos que se puede buscar rápidamente y 2) más compacta que las tablas reales, lo que permite que más del índice quepa en la memoria en lugar de ser paginado en el disco.

Si tiene un índice en cada columna, los índices ocuparán más espacio que la tabla que representan. Si la base de datos realmente utiliza todos los índices, requerirá más tiempo para intercambiarlos dentro y fuera de la memoria. Además, cada índice debe actualizarse de forma inerte, actualizar o eliminar.

Más allá de eso, los índices en una sola columna ni siquiera son lo mejor que puede hacer. La mayoría de las bases de datos de relaciones en realidad permiten un índice en varias columnas, y el orden de estas columnas es importante. Por ejemplo, si quiero buscar en una base de datos a todas las personas que asistieron a Duke de las clases entre 1980 y 1984, entonces lo que quiero es un índice en (School, ClassYear). La consulta no podría usar un índice con las mismas columnas, pero se invirtió.

Entonces, para crear todos los índices posibles, ¡hay al menos n! formas de organizar columnas en un índice. Con solo 5 columnas, hay 120 índices posibles.

Dado que hay tantos índices posibles, realmente tiene que determinar qué índices son útiles para su aplicación y crear solo esos.

Chris Pitman
fuente
Pero, en su ejemplo, ¿serían útiles dos índices: uno en la escuela y otro en ClassYear en alguno de los casos?
Dragos
@Dragos Claro, pueden ser. Si tuviera otra consulta que fuera solo durante el año de clase (todos los estudiantes que asistieron a una escuela en la clase de 2004), el índice del año de clase puede ser útil. Desafortunadamente, hay un montón de factores que el motor de consulta usa al decidir qué índice usar y cuándo. Si resulta que la mitad de las personas en la base de datos hizo ir a la escuela en 2004, entonces la base de datos solo puede pasar por alto el índice y escanear a través de toda la tabla de todos modos. Si quiere ser bueno en esto, comience a usar y leer planes de ejecución
Chris Pitman
Lo que quise decir fue, si tengo índices separados en la escuela y ClssYear, ¿serían útiles al buscar a todas las personas que asistieron a Duke de las clases entre 1980 y 1984?
Dragos
@Dragos Depende del motor db específico. Por ejemplo, Postgres utilizará algo llamado Escaneo de índice de mapa de bits para intersectar los resultados de múltiples índices. Depende del motor de consultas decidir qué índice usar, y esto siempre será específico de db.
Chris Pitman
2

Crear un índice para cada columna de una tabla suele ser una pérdida de espacio y, como han mencionado otros, puede ralentizar las operaciones de inserción / actualización. Se utiliza un índice para acelerar las consultas. Solo recomendaría agregar un índice a una columna si observa un bajo rendimiento al consultar valores en esa columna.

Algunas bases de datos pueden requerir un índice para la clave principal de una tabla, por lo que es posible que no pueda elegir esa. Además, si tiene columnas de texto muy grandes, existen tecnologías específicas que están diseñadas para la búsqueda de texto completo y el índice, pero no siempre son los mismos tipos de índice que usaría para una columna numérica pequeña.

FrustratedWithFormsDesigner
fuente