2009-09-09 17 views
5

Si es un int, sé que será más rápido, simplemente no puedo entender el tipo de cadena.Para una columna char/varchar/text, ¿por qué un índice para esa columna agilizará la búsqueda?

notas: mayoría de los idiomas asiáticos no tienen el espacio entre las palabras. y mysql no puede dividir la oración en palabras. y también, me refiero a la búsqueda aleatoria, es decir, las palabras pueden aparecer en cualquier lugar de una oración.

+0

Piense en un hilo como una serie de números ... ¿ayuda? –

Respuesta

6

Un punto importante es que un índice no ayudará en absoluto para ciertos tipos de búsquedas. Por ejemplo:

SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE '%' + @SearchText + '%' 

Ninguna cantidad de indexación normal ayudará a esa consulta. Está condenado a ser siempre lento. Esa expresión LIKE simplemente no es sargable.

¿Por qué? Primero necesita comprender cómo funcionan los índices. Básicamente toman las columnas que se indexan junto con la clave principal (puntero de registro) en una nueva tabla. Luego clasifican esa tabla en la columna indexada en lugar de la clave. Cuando hace una búsqueda utilizando el índice, puede encontrar rápidamente la (s) fila (s) que desea porque este índice está ordenado para facilitar una búsqueda más eficiente utilizando algoritmos como la búsqueda binaria y otros.

Ahora revise esa consulta nuevamente. Al colocar un comodín delante del texto de búsqueda, acaba de decirle a la base de datos que no sabe con certeza con qué comienza su columna. Ninguna cantidad de clasificación ayudará; aún necesita recorrer toda la tabla para asegurarse de encontrar cada registro que coincida con la expresión. Y eso significa que cualquier índice normal en la columna es inútil para esta consulta.

Si desea buscar una columna de texto para una cadena de búsqueda en cualquier lugar de la columna, debe usar algo un poco diferente: un índice de texto completo.

ya por el contrario un vistazo a esta consulta:

SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE @SearchText + '%' 

esto va a funcionar perfectamente bien con un índice normal, porque usted sabe cómo espera la columna para empezar. Todavía puede coincidir con los valores ordenados almacenados en el índice, por lo que podemos decir que es sargable.

+0

sí, esto es lo que me pregunto, gracias. – lovespring

4

Un índice está ordenada, una mesa no lo es. Por lo tanto, cuando busca en un índice, tiene una pista sobre dónde encontrar la cadena, incluso si hay un valor diferente para cada fila en la tabla.

Además, los índices son más pequeños (en general) que la tabla, por lo que para escanear cada columna de la tabla, debe repasar cada fila. Una búsqueda de índice es simplemente encontrar el lugar correcto en el índice, seleccionar eso, tomar el puntero al índice agrupado, y listo para obtener el resto de la fila.

+1

Si sus datos son en su mayoría únicos en los primeros caracteres, no indexe el resto de la columna char/varchar y los índices que crea la base de datos serán mucho más pequeños. La mayoría de las bases de datos que he usado siempre requieren un límite de longitud de cadena para indexar columnas de texto. – sj2009

+0

no, la búsqueda es búsqueda aleatoria, he editado mi publicación, vea mis notas. – lovespring

0

el índice es esencialmente una tabla de 2 columnas, con el campo indexado en orden clasificado, junto con las operaciones de búsqueda PK. SO para una cadena, tiene las cadenas ordenadas. Entonces, se puede realizar una búsqueda usando una búsqueda binaria en lugar de una exploración de tabla, que será mucho más rápida para casi cualquier longitud de tabla.

1

El índice es esencialmente como un índice en un libro, donde cada palabra (según el libro) que aparece en el libro se coloca en el índice, con los números de página donde aparece esa palabra. El índice está ordenado alfabéticamente, por lo que es rápido encontrar la palabra en el índice. Si no tiene el índice en un libro, la única forma de encontrar cada instancia de una palabra específica es leer todo el libro, y observar dónde aparece esa palabra.

una tabla es la misma. Si busca un registro que tiene un valor de columna específico y no tiene un índice, lo único que puede hacer la base de datos es recorrer toda la tabla para encontrar cualquier coincidencia.

1

Una guía de teléfonos está indexada según el apellido. ¿Te imaginas lo lento que sería mirar un número si no lo fuera?

2

La respuesta más simple es otro par de preguntas:

  • Por qué es encontrar a una persona por su/su última nombre muy rápida en la guía telefónica?
  • ¿Por qué es encontrar a una persona por su primero nombre no rápido en la guía telefónica?
Cuestiones relacionadas