2009-04-18 28 views
15

Recientemente aceleré una consulta complicada en un orden de magnitud dando a SQLite un buen índice para trabajar. Resultados como este hacen que me pregunte si debería indexar muchos otros campos que se usan comúnmente para las cláusulas JOIN o ORDER BY. Pero no quiero exagerar y tener un efecto negativo en mí: supongo que debe haber algunas razones no para crear índices, o cada campo estaría indexado por defecto.¿Cuáles son las desventajas de tener muchos índices?

Estoy usando SQLite en este caso, pero, por supuesto, también es bienvenido el asesoramiento agnóstico de DBMS.

Respuesta

36

Los índices ralentizan las inserciones y las actualizaciones (lo que puede convertirse en un problema realmente grave con el bloqueo) y cuestan espacio en disco. Eso es practicamente todo.

+2

Eso lo cubre. No olvide que * necesita * índices adecuados para un buen rendimiento de inserción/actualización/eliminación, también. Como todas las cosas, es un equilibrio. Las inserciones –

+5

no se benefician de los índices ... Las actualizaciones y eliminaciones requieren encontrar la (s) fila (s) relevante (s), por lo que se benefician de los índices para ese paso, pero luego si tiene muchos índices, incluso ese beneficio puede ser negado. Como dices, todo es un balance :) – MatBailie

6

Los índices consumen espacio en el disco para almacenar y se toman su tiempo para crear y mantener. Los no utilizados no dan ningún beneficio. Si hay muchos índices candidatos para una consulta, la consulta puede ralentizarse haciendo que el servidor elija el "incorrecto" para la consulta.

Use esos factores para decidir si necesita un índice.

Por lo general, es posible crear índices que NUNCA se utilizarán; por ejemplo, e indexar en un campo (no nulo) con solo dos valores posibles, es casi seguro que va a ser inútil.

Debe explicar las consultas de su propia aplicación para asegurarse de que las realizadas con frecuencia utilizan índices razonables si es posible, y no crear más índices de los necesarios para hacerlo.

+0

La indexación de un campo de dos valores puede (ocasionalmente) ser útil cuando la distribución es extremadamente desigual, y la base de datos lo sabe a través de las estadísticas. –

5

El costo de un índice en el espacio en disco es generalmente trivial. El costo de las escrituras adicionales para actualizar el índice cuando la tabla cambia a menudo es moderado. El costo en bloqueo adicional puede ser severo.

Depende de la relación lectura contra escritura en la tabla y de la frecuencia con la que el índice se usa para acelerar una consulta.

+1

Hmmm, dependiendo de la tabla y los campos que se indexan, el costo del espacio en disco no siempre es trivial. He tenido muchos casos en los que la suma del espacio de índice era el doble (o más) que la suma del espacio de tabla ... – MatBailie

+0

Estoy de acuerdo con Dems; para una tabla estrecha, un índice no agrupado puede ser de un tamaño comparable al de la tabla. Supongamos que un índice cuesta la mitad del espacio de disco de la tabla; una tabla con seis índices es cuatro veces más grande en disco que una no indexada. Los índices agrupados son básicamente gratuitos. –

+1

No, el costo de un índice en el espacio de disco no es "generalmente trivial".Es posible usar mucho espacio con índices. – MarkR

6

Para probar su aplicación en particular, puede poner "EXPLICAR QUERY PLAN" delante de cualquier consulta que ejecute y comprobar los resultados. Le mostrará dónde está o no está usando índices.

De esta forma puede determinar dónde podría usar más índices y dónde no marcarían la diferencia.

Sqlite Explain

utilizo SqliteSpy a prueba de mano consulta que parece estar causando problemas.

Cuestiones relacionadas