2010-05-24 14 views
5

Tengo 10mln filas en mi tabla en MySQL y 7 índices en esta tabla. Ahora cuando trato de agregar 8th, toma un tiempo infinito para hacer esto. ¿Hay alguna manera de solucionar este problema para agregar 8vo índice fácil y rápido?¿Cómo crear índice más rápido?

+0

No debe ser infinito. Proporcione detalles del esquema y el índice de su tabla. –

+0

Y si toma "para siempre", compruebe si se está quedando sin espacio en disco en algún lugar; la creación de índices puede requerir una gran cantidad de espacio temporal. – nos

+0

Es un error de MySQL que cada índice siguiente tome más tiempo. Tengo 400 MB de memoria real y 1,6 MB de intercambio, y no se usa en absoluto mientras creo el índice, y tengo como 20 GB de espacio –

Respuesta

2

Esta es una de las mil formas en que MySQL simplemente apesta. Por diseño ...

Detalles: http://lists.mysql.com/mysql/202489

y no me importa si pierdo el karma de esta respuesta.

+0

Sí, creo que estoy hablando de –

+0

Estaba sorprendido cuando vi que la ejecución de ALTER TABLE para cambiar el valor predeterminado - o capacidad de anulación - de una columna, se realizaba copiando toda la tabla y recreando todos los índices. Estas cosas toman muy poco tiempo en otros DMBS; la forma recomendada de hacerlo en MySQL para tablas grandes era ensuciar el sistema de archivos, cambiar la definición de la tabla con un archivo de datos vacío y volver a colocar el archivo de datos completo en su lugar. –

+1

El póster de este artículo es completamente incorrecto. MySQL reconstruye tablas en muchos casos cuando lo hace ALTER TABLE, pero nunca reconstruye la tabla más de una vez por sentencia ALTER; además, puedes hacer un número arbitrario de modificaciones con un solo ALTER si lo deseas. – MarkR

5

No, el tiempo que se tarda en crear un índice es directamente proporcional a la cantidad de datos que tiene. En MS SQL creo índices en una tabla con tantos registros en aproximadamente 10 minutos.

EDITAR: Después de ver el comentario, por favor elabore en infinito. Por definición, estás diciendo que nunca termina, mi respuesta está relacionada con una creación de índice de ejecución larga y no infinita.

+0

Sí, tomó 15 minutos –

+0

Entonces eres casi tan bueno como se pone. La indexación es una tarea muy intensa, especialmente con muchos registros. –

0

¿Qué motor está utilizando? La implementación de ALTER TABLE ... CREATE INDEX varía significativamente.

Usando MyISAM, cualquier cambio de índice requiere una reconstrucción completa de la tabla. Esto no es inherente al motor, sino un error que nunca se ha corregido.

Al utilizar InnoDB, la creación de un índice secundario no requiere una reconstrucción de la tabla, pero esta optimización solo está disponible si está utilizando el complemento InnoDB (en lugar del motor enviado anterior). Cambiar la clave principal siempre requiere una reconstrucción, porque está agrupada.

La reconstrucción de la tabla (en cualquier caso) requiere mucho trabajo, ya que debe reconstruir todos los índices existentes, así como reescribir las filas, para completar la operación. Si su mesa cabe en la RAM (las filas de 10M suenan como debería hacerlo fácilmente), esto es relativamente rápido.

Reconstruir una mesa que no cabe en ram es bastante costosa, recomiendo que se evite si es posible.

La reconstrucción de un índice individual que no cabe en el RAM, es MUY costosa y es mejor evitarla.

¿Con qué frecuencia necesita agregar nuevos índices? ¿Quizás pueda completar las tablas con el índice ya creado?