2010-11-04 23 views
19

En documentos para varios ORM siempre proporcionan una forma de crear índices, etc. Siempre mencionan para asegurarse de crear los índices apropiados para la eficiencia, como si eso fuera conocimiento inherente a un SQLer no escrito a mano que necesita usa un ORM Mi comprensión de los índices (fuera de PK) es básicamente: si planea hacer LIKE consultas (es decir, buscar) en función del contenido de una columna, debe usar un índice de texto completo para esa columna. ¿Qué más debería saber sobre los índices (principalmente relacionados con la eficiencia)? Siento que hay un mundo de conocimiento en la puerta de mi casa, pero hay una gran alfombrilla de ratón doblada debajo, así que no puedo pasar (no sé por qué sentí que tenía que decir eso, pero gracias por proporcionar el sofá).¿Cómo sé cuándo indexar una columna y con qué?

Respuesta

21

pensar en un índice muy aproximadamente igual que el índice en la parte posterior de un libro. Es un área totalmente separada del contenido del libro, donde si buscas algún valor específico, puedes ir al índice y buscarlo (los índices están ordenados, por lo que encontrarlos allí es mucho más rápido que escanear cada página del libro).)

La entrada de índice tiene un número de página, por lo que puede ir rápidamente a la página que busca su tema. Un índice de base de datos es muy similar; es una lista ordenada de la información relevante en su base de datos (los campos incluidos en el índice), con información para que la base de datos encuentre los registros que coinciden.

Entonces ... crearía un índice cuando tenga información que necesita buscar con frecuencia. Los índices normales no lo ayudan con búsquedas "parciales" como las consultas LIKE, pero cada vez que necesita obtener un conjunto de resultados donde el campo X tiene cierto (s) valor (es), evitan que el DBMS "escanee" toda la tabla , buscando valores coincidentes.

También ayudan cuando necesita ordenar en una columna.

Otra cosa a tener en cuenta; Si el DBMS le permite crear índices individuales que tienen múltiples campos, asegúrese de investigar los efectos de hacerlo, específicos para su DBMS. Un índice que incluya múltiples campos probablemente solo sea completo (o del todo) útil si todos esos campos se usan en una consulta. Por el contrario, tener múltiples índices para una sola tabla, con un campo por índice, puede no ser de mucha (o ninguna) ayuda para las consultas que están filtrando/clasificando por múltiples campos.


Ha mencionado los índices de texto completo y las PK (teclas principales). Estos son diferentes a los índices regulares, aunque a menudo sirven para propósitos similares.

En primer lugar, tenga en cuenta que una clave principal suele ser un índice (en MSSQL, un "índice agrupado", de hecho), pero no es necesario que sea el caso específicamente. Como ejemplo, un MSSQL PK es un índice agrupado por defecto; los índices agrupados son especiales porque no son un bit separado de los datos almacenados en otro lugar, pero los datos en sí están ordenados en la tabla por el índice agrupado. Esta es la razón por la cual un PK popular es un valor int que se genera automáticamente con valores secuenciales en aumento. Entonces, un índice agrupado ordena los datos en la tabla específicamente por el valor del campo. Compare esto con un diccionario tradicional; las entradas mismas están ordenadas por la 'clave', que es la palabra que se está definiendo.

Pero en MSSQL (consulte la documentación de su DBMS para su información), puede cambiar el índice agrupado para que sea un campo diferente, si lo desea. A veces esto se hace en los campos basados ​​en datetime.


Los índices de texto completo son diferentes tipos de bestias por completo. Usan algunos de los mismos principios, pero lo que están haciendo no es exactamente lo mismo que los índices normales, que estoy describiendo. Además: en algunos DBMS, las consultas LIKE hacen no usan el índice de texto completo; Se requieren operadores especiales de consulta.

Estos índices son diferentes porque su intención no es encontrar/ordenar todo el valor de la columna (un número, una fecha, un poco de datos de caracteres), sino encontrar palabras/frases individuales dentro del texto campo (s) que se indexan.

También suelen permitir la búsqueda de palabras similares, tiempos verbales diferentes, faltas de ortografía comunes y cosas por el estilo, y generalmente ignoran las palabras irrelevantes. La forma diferente en que funcionan es por qué también pueden necesitar diferentes operadores para usarlos. (¡otra vez, revise su documentación local para su DBMS!)

+3

Excelente, gracias. Entonces, básicamente, un índice es solo una lista de valores de una columna, cada uno con un enlace a la fila correcta (supongo que este sería el PK). De lo contrario, el DBMS tendría que recorrer las filas de la tabla, mirando solo la columna relevante mientras busca un resultado. Si eso es (aproximadamente) correcto, tu respuesta me ayudó mucho. – orokusaki

+0

@orokusaki Edité su comentario como lo señaló. (Mods puede editar sin límite de tiempo). Buena aclaración! –

Cuestiones relacionadas