Pregunta

Yo uso índices como la mayoría de desarrolladores de hacer (sobre todo en ... bien! Índice), pero estoy seguro de que hay un montón de manera sutil para optimizar el uso de una base de datos de índice. No estoy seguro de si es específica para cualquier implementación de un DBMS.

Mi pregunta es: ¿cuáles son buenos ejemplos de cómo utilizar el índice (a excepción de los casos obvios, básicos), y cómo un DBMS optimizar su base de datos cuando se especifica un índice en una tabla

¿Fue útil?

Solución

Piense en un índice como "tabla de contenidos" ... que es una lista ordenada de punteros a funciones en un archivo, también conocido como compensaciones. Decir que usted tiene millones de registros almacenados en una tabla, en lugar de buscar en la tabla de criterios de búsqueda, que es mucho más rápido para hacer referencia a una lista ordenada de partidos, y luego apilar los punteros a las filas coincidentes específica. Un ejemplo perfecto de un índice es un campo de clave principal mesas, más típicamente su campo "id". Si quieres fila ID # 11234566, es mucho más rápido pedir al índice de un puntero a los datos de lo que es para escanear la fuente de datos para la posición 11234566.

Aquí hay un uso no tan obvia de la indexación:

CREATE TABLE activity_log (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
activity_type_id SMALLINT UNSIGNED NOT NULL,
datetime_created DATETIME
KEY(activity_type_id),
PRIMARY KEY(id)
);
CREATE TABLE activity_log_to_date_key (
activity_log_id INT UNSIGNED NOT NULL,
date_created_key  INT UNSIGNED NOT NULL REFERENCES dim_datetime(id),
UNIQUE KEY(activity_log_id),
KEY(date_created_key)
);
CREATE TABLE dim_datetime (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
date_hour DATETIME NOT NULL,
PRIMARY KEY(id),
KEY(date_hour)
);

Su operación puede crear su expediente de registro, pero a continuación, crear una referencia a una fecha y hora indexada que es más rápido para buscar / especie que no sea su tabla de registro. Luego unirse a volver a su tabla de registro de su propia clave primaria. Si necesitas que ampliar esto, que me haga saber. Espero que esto tenga sentido.

Consulta de ejemplo:

SELECT a.activity_log_id, al.activity_type_id, al.datetime_created
FROM activity_log_to_date_key a 
INNER JOIN dim_datetime d ON (d.id = a.date_created_key)
LEFT JOIN activity_log al ON (al.id = a.activity_log_id)
WHERE d.date_hour BETWEEN '2009-01-01 00:00:00' AND '2009-06-01 12:00:00';

Otros consejos

Un punto que mucha gente parece que se pierda es que un DBMS a menudo (o puede solamente) sólo utilizan un índice por referencia de tabla en una consulta, y si se puede y hace uso de varios índices que probablemente sería más rápido para utilizar un índice combinado si está presente.

Por ejemplo, si busca una mesa grande para las filas WHERE AnIntegerColumn = 42 AND AnOtherInt = 69 la ruta más rápida a las filas sería un índice en las dos columnas AnIntegerColumn y AnOtherInt. Si sólo tiene un índice en cada índice individual, pero sin combinada del DB o bien buscar uno u otro índice y separado filtrar los resultados con la segunda cláusula, o escanear ambos y casarse con los resultados después.

Otra operación simple común que puede ser mejorado 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 pedidos se pueden realizar al mismo tiempo en algunas circunstancias

La adición de demasiados índices puede ser una mala optimización, por supuesto, ya que el espacio extra que se usa para almacenar los índices (y el IO-carga para mantener ellos si su base de datos ve muchas operaciones de escritura) puede ser un problema peor que el un poco menos óptima leer las preguntas, así que no sobre-hacerlo.

David y Randy tienen esta cubierta. Sólo quería añadir que el comando EXPLAIN puede ser un gran ayuda en averiguar cuándo obtendrá un gran ahorro de crear un índice, así como lo que sugiere que se necesitan índices. Se mostrará los pasos que la base de datos está tomando para ejecutar la consulta, para que sepa qué bits están tomando el tiempo más largo.

Algo que no he visto mencionado sin embargo, en este caso es que cuando se tiene más de un disco es probable que desee poner su índice en un disco diferente de donde los datos son en realidad en. Esto puede acelerar algunas operaciones arriba. Creo que esto merece una pregunta en su propio derecho Tho.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top