database - una - view lenta mysql
¿Cómo sé cuándo indexar una columna y con qué? (2)
En los documentos para varios ORM, siempre proporcionan una forma de crear índices, etc. Siempre mencionan para asegurarse de crear los índices adecuados para la eficiencia, como si eso fuera un conocimiento inherente a un SQLer que no está escrito a mano y que necesita usar un ORM. Mi comprensión de los índices (fuera de PK) es básicamente: si planea realizar consultas LIKE
(es decir, buscar) en función del contenido de una columna, debe usar un índice de texto completo para esa columna. ¿Qué más debo 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 enorme almohadilla de ratón doblada debajo de ella, así que no puedo pasar (no sé por qué sentí que necesitaba decir eso, pero Gracias por proporcionar el sofá).
Esta respuesta es específica de Oracle, pero los puntos principales de las respuestas se aplican a la mayoría de los sistemas de bases de datos relacionales.
Piense en un índice muy parecido al índice en la parte posterior de un libro. Es un área totalmente separada del contenido del libro, donde si está buscando algún valor específico, puede ir al índice y buscarlo (los índices están ordenados, por lo que encontrar cosas allí es mucho más rápido que escanear cada página del libro). ).
La entrada del í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 necesite buscar con frecuencia. Los índices normales no lo ayudan a realizar búsquedas ''parciales'' como consultas LIKE, pero cada vez que necesite obtener un conjunto de resultados en los que el campo X tiene ciertos valores, evitan que el DBMS tenga que ''escanear'' toda la tabla , buscando valores coincidentes.
También ayudan cuando necesitas ordenar en una columna.
Otra cosa a tener en cuenta; Si el DBMS le permite crear índices únicos que tienen múltiples campos, asegúrese de investigar los efectos de hacerlo, específicos para su DBMS. Es probable que un índice que incluya varios campos solo sea completamente (o en absoluto) útil si todos esos campos se están utilizando en una consulta. A la inversa, tener múltiples índices para una sola tabla, con un campo por índice, puede no ser de gran ayuda (o ninguna) para las consultas que se están filtrando / clasificando por múltiples campos.
Mencionó los índices de texto completo y las PK (claves principales). Estos son diferentes de los índices regulares, aunque a menudo tienen propósitos similares.
En primer lugar, tenga en cuenta que una clave primaria suele ser un índice (en MSSQL, un ''índice agrupado'', de hecho), pero esto no tiene por qué ser el caso específicamente. Como ejemplo, un PK de MSSQL es un índice agrupado de forma predeterminada; Los índices agrupados son especiales porque no son un bit separado de datos almacenados en otro lugar, pero los datos en sí están ordenados en la tabla en orden por el Índice agrupado. Es por esto que un PK popular es un valor int
que se genera automáticamente con valores crecientes secuenciales. Por lo tanto, un índice agrupado ordena los datos en la tabla específicamente por el valor del campo. Compara esto con un diccionario tradicional; las entradas en sí están ordenadas por la ''clave'', que es la palabra que se define.
Pero en MSSQL (verifique 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 campos basados en datetime
.
Los índices de texto completo son diferentes tipos de bestias por completo. Utilizan 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
no utilizan el índice de texto completo; Se requieren operadores de consulta especiales.
Estos índices son diferentes porque su intención no es encontrar / ordenar el valor total de la columna (un número, una fecha, un pequeño bit de los datos de caracteres), sino buscar palabras o frases individuales dentro del (los) campo (s) de texto. siendo indexado.
A menudo, también pueden habilitar la búsqueda de palabras similares, tiempos verbales, faltas de ortografía comunes y similares, y generalmente ignoran las palabras de ruido. La forma diferente en que trabajan es la razón por la cual también pueden necesitar diferentes operadores para usarlos. (de nuevo, verifique su documentación local para su DBMS!)