2008-10-23 16 views
24

¿Por qué las bases de datos no indexan automáticamente las tablas según la frecuencia de las consultas? ¿Existen herramientas para analizar una base de datos y las consultas que está recibiendo, y crear automáticamente, o al menos sugerir qué índices crear?¿Alguna base de datos admite la creación automática de índices?

Estoy especialmente interesado en MySQL, pero me gustaría tener curiosidad por otras bases de datos también.

Respuesta

9

Hay optimizadores de bases de datos que se pueden habilitar o adjuntar a las bases de datos para sugerir (y en algunos casos realizar) índices que pueden ayudar.

Sin embargo, en realidad no es un problema trivial, y cuando salieron estas ayudas, los usuarios a veces descubrieron que en realidad ralentizaban sus bases de datos debido a optimizaciones inferiores.

Por último, hay un montón de dinero en la industria para los arquitectos de bases de datos, y prefieren el status quo.

Aún así, las bases de datos son cada vez más inteligentes. Si usa el perfilador de SQL Server con el servidor Microsoft SQL, encontrará formas de acelerar su servidor. Otras bases de datos tienen perfiladores similares, y hay utilidades de terceros para hacer este trabajo.

Pero si usted es el que está escribiendo las consultas, es de esperar que sepa lo suficiente sobre lo que está haciendo para indexar los campos correctos. Si no, entonces tener los índices correctos es probable que el menor de sus problemas ...

-Adam

+12

¡Qué declaración tonta, "los arquitectos de bases de datos prefieren el status quo".Sí, somos un gran cártel que aplaca todo intento de hacer que las bases de datos se auto indexen. Como el dispositivo simple que agregas a tu auto para obtener 100mpg que las compañías petroleras nos ocultan. –

+4

@ Adam Davis: "Pero si usted es el que escribe las consultas, con suerte usted sabe lo que está haciendo para indexar los campos correctos. De lo contrario, tener los índices correctos es probablemente el menor de sus problemas" - no tener los índices correctos describe una buena proporción de todas las bases de datos disponibles ... –

+1

El script SQL simple hereda las propias métricas internas de SQL Server con una lista de índices y el beneficio estimado de crearlas: funciona en 2005, 2008 y 2012: http: //blogs.msdn.com/b/bartd/archive/2007/07/19/are-you-using-sql-s-missing-index-dmvs.aspx –

2

Hay herramientas para esto.

Para MS SQL, utilice el Analizador de SQL (para registrar actividad en la base de datos) y el Asistente de ajuste de motor de base de datos (SQL 2005) o el Asistente de ajuste de índice (SQL 2000) para analizar las actividades y recomendar índices u otras mejoras .

4

MS SQL 2005 también mantiene una referencia interna de los índices sugeridos para crear sobre la base de datos de uso. No es tan completo o preciso como el Tuning Advisor, pero es automático. Investigue dm_db_missing_index_groups para más información.

1

Estoy de acuerdo con lo que dice Adam Davis en su comentario. Añadiré que si existiera ese mecanismo para crear índices automáticamente, la reacción más común a esta característica sería: "Eso está bien ... ¿Cómo lo apago?"

13

Esa es la mejor pregunta que he visto en stackoverflow. Lamentablemente no tengo una respuesta. La tabla grande de Google indexa automáticamente las columnas correctas, pero BigTable no permite combinaciones arbitrarias, por lo que el espacio problemático es mucho más pequeño.

La única respuesta que puedo dar es la siguiente:

Un día alguien le preguntó: "¿Por qué no puede el equipo acaba de analizar el código y compilar y & estáticamente escriba las piezas de código que se ejecutan con mayor frecuencia?"

Las personas están solucionando este problema hoy (por ejemplo, Tamarin en FF3.1), y creo que las bases de datos relacionales de "autoindexación" tienen la misma clase de problema, pero no es una prioridad. Dentro de una década, agregar índices manualmente a una base de datos se considerará una pérdida de tiempo. Por ahora, estamos atascados con la supervisión de consultas lentas y optimizadores en ejecución.

+1

Si hubiera una respuesta correcta, la base de datos ya lo haría . Siempre hay una compensación. Podría tener cientos de índices y las consultas siempre se ejecutarían rápidamente, pero las inserciones y las actualizaciones se arrastrarían. ¿Cual es mejor? Debido a que su consulta se ejecuta con frecuencia, no significa que sea el trabajo más importante para usted. –

+0

@Mark Brady: lugar: siempre es un intercambio. –

+0

Esta respuesta se escribió en 2008 ... es casi 2018 y todavía estamos donde estábamos entonces ... agregando índices manuales y buscando en google para ver si ha habido algún movimiento en este espacio. Loco ¿verdad? – degenerate

1

Parte del motivo puede ser que los índices no solo dan una pequeña aceleración. Si no tiene un índice adecuado en una tabla grande, las consultas pueden ejecutarse tan lentamente que la aplicación no se puede utilizar por completo y, posiblemente, si está interactuando con otro software, simplemente no funcionará. Entonces realmente necesita que los índices estén correctos antes de comenzar a tratar de usar la aplicación.

Además, en lugar de crear un índice en segundo plano y desacelerar aún más las cosas mientras se está creando, es mejor tener el índice definido antes de comenzar a agregar cantidades significativas de datos.

Estoy seguro de que obtendremos más herramientas que toman consultas de muestra y resuelven qué índices son necesarios; también probablemente obtengamos bases de datos que hagan lo que usted sugiera y monitoree el desempeño y agregue los índices que crean que son necesarios, pero no creo que sean un reemplazo para comenzar con los índices correctos.

1

Parece que MySQL no tiene un generador de perfiles fácil de usar. Tal vez quieras probar algo como this, una clase php basada en MySQL Profiler.

2

Sí, algunos motores admiten la indexación automática. Un ejemplo de este tipo para mysql es Infobright, su motor no admite índices "convencionales" e indexa implícitamente todo: se trata de un motor de almacenamiento basado en columnas.

El comportamiento de tales motores tiende a ser muy diferente de lo que los desarrolladores (y sí, usted necesita para ser un DESARROLLADOR incluso pensando en usar Infobright, no es un reemplazo de un motor estándar).

1

SimpleDB de Amazon tiene la indexación automática en todas las columnas en base a su uso:

http://aws.amazon.com/simpledb/

Tiene otras limitaciones sin embargo:

  • Es un almacén de claves-valor, no una RDB. Obviamente, eso significa uniones lentas (y ninguna compatibilidad de unión incorporada).
  • Tiene un límite de 10 gb en el tamaño de la tabla. Hay bibliotecas que manejarán particionar grandes datos para usted, aunque esto lo encierra en la forma de hacer de esa biblioteca, que puede tener sus propios problemas.
  • Almacena todos los valores como cadenas, números pares, lo que hace que clasificar una columna con un 1,9 y 10 salgan como 1,10,9 a menos que use una biblioteca que lo piratee por 0. Esto también afecta los números negativos.

El límite de 10 gb es más grande de lo que muchos podrían suponer, por lo que puede continuar con esto para un sitio simple que planea reescribir si alguna vez llega a ser grande.

Desafortunadamente, este tipo de indexación automática no se convirtió en DynamoDb, que parece haberlo reemplazado. Ya ni siquiera mencionan a SimpleDb en su lista de productos, tiene que encontrarlo a través de vínculos antiguos.

Cuestiones relacionadas