Utilizo índices como lo hacen la mayoría de los desarrolladores (principalmente en ... ¡bueno! Índice), pero estoy seguro de que hay muchas formas sutiles de optimizar una base de datos utilizando el índice. No estoy seguro de si es específico de cualquier implementación de un DBMS.
Mi pregunta es: ¿cuáles son buenos ejemplos de cómo usar el índice (excepto en casos básicos y obvios) y cómo un DBMS optimiza su base de datos cuando especifica un índice en una tabla?
Respuestas:
Piense en un índice como "tabla de contenido" ... que es una lista ordenada de punteros a posiciones en un archivo, también conocido como compensaciones. Supongamos que tiene millones de registros almacenados en una tabla, en lugar de buscar criterios coincidentes en la tabla, es mucho más rápido hacer referencia a una lista ordenada de coincidencias, luego apilar los punteros a las filas coincidentes específicas. Un ejemplo perfecto de un índice es un campo de clave primaria de tablas, más típicamente su campo "id". Si desea la ID de fila # 11234566, es mucho más rápido pedirle al índice un puntero a los datos que escanear la fuente de datos para la posición 11234566.
Aquí hay un uso no tan obvio de la indexación:
Su operación puede crear su registro de registro, pero luego crear una referencia a una fecha y hora indexada que sea más rápida de buscar / ordenar que su tabla de registro. Luego, vuelva a unir su tabla de registro en su propia clave principal. Si necesita que amplíe esto, hágamelo saber. Espero que esto tenga sentido.
Consulta de muestra:
fuente
Un punto que mucha gente parece pasar por alto es que un DBMS a menudo (o solo puede) usar solo un índice por referencia de tabla en una consulta, y si puede y usa múltiples índices, probablemente sería más rápido usar un combinado índice si está presente.
Por ejemplo, si busca filas en una tabla grande,
WHERE AnIntegerColumn = 42 AND AnOtherInt = 69
la ruta más rápida hacia esas filas sería un índice en las dos columnas AnIntegerColumn y AnOtherInt. Si solo tiene un índice en cada uno individualmente pero no tiene un índice combinado, el DB buscará uno u otro índice y filtrará por separado los resultados con la segunda cláusula, o escaneará ambos y unirá los resultados después.Otra operación simple común que se puede mejorar con índices compuestos es
WHERE SomeColumn = <SomeValue> ORDER BY SomeOtherColumn
: si hay un índice en SomeColumn y SomeOtherColumn (en el orden correcto), las operaciones de filtrado y ordenación pueden realizarse al mismo tiempo en algunas circunstancias.Por supuesto, agregar demasiados índices puede ser una mala optimización, ya que el espacio adicional utilizado para almacenar los índices (y la carga de E / S para mantenerlos si su DB ve muchas operaciones de escritura) puede ser un problema peor que las consultas de lectura ligeramente menos óptimas , así que no lo hagas en exceso.
fuente
David y Randy tienen esto cubierto. Solo quería agregar que el
EXPLAIN
comando puede ser de gran ayuda para determinar cuándo obtendrá un gran ahorro al crear un índice, así como para sugerir qué índices son necesarios. Mostrará los pasos que la base de datos está tomando para ejecutar su consulta, de modo que sepa qué bits están tardando más.fuente
Algo que aún no he mencionado aquí es que cuando tienes más de un disco, probablemente quieras poner tu índice en un disco diferente de donde están realmente los datos. Esto puede acelerar algunas operaciones. Creo que esto merece una pregunta por derecho propio.
fuente