Estoy trabajando en una base de datos MySql , con una tabla como esta:
+--------------+
| table_name |
+--------------+
| myField |
+--------------+
... y necesito hacer muchas consultas como esta (con 5-10 cadenas en la lista) :
SELECT myField FROM table_name
WHERE myField IN ('something', 'other stuff', 'some other a bit longer'...)
Habrá alrededor de 24,000,000 filas únicas
1) ¿Debo usar una tecla FULLTEXT
o INDEX
para mi VARCHAR(150)
?
2) Si aumento los caracteres de 150 a 220 o 250 ... ¿haría una gran diferencia? (¿Hay alguna forma de calcularlo?)
3) Como dije, serán únicos, por lo que myField debería ser una CLAVE PRIMARIA . ¿No es raro agregar una CLAVE PRIMARIA a un campo que ya es un ÍNDICE VARCHAR / FULLTEXT?
mysql
index
full-text-search
varchar
Mark Tower
fuente
fuente
Respuestas:
SUGERENCIA # 1: Indexación estándar
Si indexa de esta manera, puede buscar la cadena completa o realizar búsquedas LIKE orientadas a la izquierda
SUGERENCIA # 2: indexación FULLTEXT
Puede utilizar eficazmente las búsquedas de palabras clave individuales, así como frases completas. Deberá definir una lista de palabras clave personalizada porque MySQL no indexará 543 palabras .
Aquí están mis otras publicaciones de los últimos dos años en índices FULLTEXT
May 23, 2011
: Optimizando la búsqueda de texto completo de mysql (StackOverflow)Oct 25, 2011
: Índice FULLTEXT ignorado en MODO BOOLEANO con condicional 'número de palabras'Jan 26, 2012
: Mysql fulltext search optimización my.cnfMay 07, 2012
: MySQL EXPLAIN no muestra 'use index' para FULLTEXTSUGERENCIA # 3: Indexación de hash
Si está buscando un valor específico y esos valores podrían tener una longitud muy superior a 32 caracteres, puede almacenar el valor hash:
De esa manera, solo busca valores hash para recuperar resultados
Darle una oportunidad !!!
fuente
like 'a%'
?MySQL le permite definir un índice prefijado, lo que significa que define los primeros N caracteres de la cadena original a indexar, y el truco consiste en elegir un número N que sea lo suficientemente largo como para proporcionar una buena selectividad, pero lo suficientemente corto como para ahorrar espacio. El prefijo debe ser lo suficientemente largo como para que el índice sea casi tan útil como lo sería si indexara toda la columna.
Antes de continuar, definamos algunos términos importantes. La selectividad del índice es la relación del total de valores indexados distintos y el número total de filas . Aquí hay un ejemplo para la tabla de prueba:
Si indexamos solo el primer carácter (N = 1), la tabla de índice se verá como la siguiente tabla:
En este caso, la selectividad del índice es igual a IS = 1/3 = 0.33.
Veamos ahora qué sucederá si aumentamos el número de caracteres indexados a dos (N = 2).
En este escenario IS = 2/3 = 0.66, lo que significa que aumentamos la selectividad del índice, pero también hemos aumentado el tamaño del índice. El truco consiste en encontrar el número mínimo N que dará como resultado una selectividad de índice máxima .
Hay dos enfoques que puede hacer cálculos para su tabla de base de datos. Haré una demostración en el volcado de esta base de datos .
Digamos que queremos agregar la columna last_name en la tabla de empleados al índice, y queremos definir el número N más pequeño que produzca la mejor selectividad del índice.
Primero identifiquemos los apellidos más frecuentes:
Como puede ver, el apellido Baba es el más frecuente. Ahora vamos a encontrar los prefijos de apellido más frecuentes , comenzando con los prefijos de cinco letras.
Hay muchas más ocurrencias de cada prefijo, lo que significa que tenemos que aumentar el número N hasta que los valores sean casi los mismos que en el ejemplo anterior.
Aquí están los resultados para N = 9
Aquí están los resultados para N = 10.
Estos son muy buenos resultados. Esto significa que podemos hacer que el índice en la columna last_name indexe solo los primeros 10 caracteres. En la columna de definición de tabla, last_name se define como
VARCHAR(16)
, y esto significa que hemos guardado 6 bytes (o más si hay caracteres UTF8 en el apellido) por entrada. En esta tabla hay 1637 valores distintos multiplicados por 6 bytes que son aproximadamente 9 KB, e imagine cómo crecería este número si nuestra tabla contiene millones de filas.Puede leer otras formas de calcular el número de N en mis índices indexados en MySQL .
Usar las funciones MD5 y SHA1 para generar valores que deberían indexarse tampoco es un buen enfoque . ¿Por qué? Léalo en la publicación Cómo elegir el tipo de datos correcto para una clave primaria en la base de datos MySQL
fuente
If you index like this, you can either look for the whole string or do left-oriented LIKE searches
. También dije en la sugerencia # 3:If you are looking for one specific value and those values could be lengths well beyond 32 characters, you could store the hash value:
. Su respuesta demuestra adecuadamente por qué uno no debe usar teclas enormes y debe indexar los caracteres más a la izquierda, lo que puede marcar una diferencia en el rendimiento. Tu respuesta pertenece aquí. +1 por su respuesta y Bienvenido a DBA StackExchange.