Determinar el estado de un índice en MySQL
-
27-09-2019 - |
Pregunta
He creado un nuevo índice en una tabla con los 35 millones de registros y su estado funcionando durante casi un 1 día de estos. Anteriormente cuando creé índices tardó 20 minutos, hay columnas fueron embargo flotadores. El nuevo idnex está en una varchar (45)
I utiliza el comando processlist que muestra la creación de índices todavía está en marcha con la siguiente salida
65417 | Repair with keycache | CREATE INDEX insert_index on checkins(dateinserted)
Me preguntaba si alguien me podría dar consejos sobre cómo encontrar a cabo si la consulta es en realidad muertos y está sentado en la lista de procesos. Tal vez algo ha ido mal tiene en algún momento y no estoy al tanto.
Gracias
Solución
Su índice está construyendo, pero muy lentamente.
MySQL tiene dos métodos disponibles para la construcción de índices:
- por la clasificación. Este es el método más rápido, pero utiliza una gran cantidad de memoria.
- por keycache. Lento, lento, lento -. Pero utiliza poca memoria
El método keycache es un poco como la ordenación por inserción: los valores se insertan en el índice a la vez. Este es el mismo método utilizado por el servidor cuando se utiliza la instrucción INSERT para añadir filas a la tabla.
El método de clasificación ordena todos los valores utilizando la clasificación rápida, y luego se construye el índice de eso. Es muy rápido, pero requiere una gran cantidad de memoria y espacio en disco temporal.
Algunas variables de servidor puede aumentar el espacio disponible para el método de clasificación, y así permitir que el trabajo con tablas más grandes. Ver myisam_max_sort_file_size
En Linux, se puede seguir el progreso de la reparación índice controlando el tamaño de los archivos temporales que se utilizan para construir el índice. El siguiente comando lista de todos los archivos que mantiene abierto el proceso de MySQL:
sudo ls -l /proc/[mysql-pid]/fd
A continuación, echa un vistazo al tamaño de los hashes con en su nombre -. Estos son los archivos temporales
Otros consejos
Tenga en cuenta el tamaño del índice será 35M * 45 por lo menos. Si se trata de una columna utf8 entonces será 35M * 45 * 3. Eso es más de 4 gigas! Si usted no tiene un montón de memoria RAM para el apoyo que va a tener que hacer un montón de acceso a disco y realmente matar a rendimiento.
¿Se puede normalizar esta columna a cabo en otra tabla?
Si no lo hacen los valores tienden a variar con la suficiente decir que los primeros 8 caracteres? Usted puede ser capaz de salirse con sólo la indexación de los primeros 8 a continuación.