2010-06-28 9 views
8

Tengo una tabla con más de 10 millones de filas. Necesito crear un índice en una sola columna, sin embargo, el índice tarda tanto tiempo en crear que obtenga bloqueos en la tabla.crear un índice sin bloquear el DB

Puede ser importante tener en cuenta que el índice se está creando como parte de un paso 'rake db: migrate' ... No me conviene crear el índice manualmente si eso funciona.

ACTUALIZACIÓN: Supongo que debería haber mencionado que esta es una tabla de escritura frecuente.

+0

Las cerraduras están bien. ¿Estás recibiendo tiempos de espera o bloqueos? –

+1

Las cerraduras no están bien. Esa es la queja. – Richard

+0

¿Alguna vez encontró una respuesta para esto? – tj111

Respuesta

3

MySQL El motor NDBCLUSTER puede crear un índice en línea sin bloquear las escrituras en la tabla. Sin embargo, el motor InnoDB más utilizado no es compatible con esta característica. Otra base de datos gratuita y de fuente abierta Postgres admite 'crear índice al mismo tiempo'.

+0

'crear índice al mismo tiempo' se agregó en la versión 8.2 o allí. – Richard

+0

Recientemente hemos estado usando Percona toolkit para hacer cambios de esquema en línea sin bloquear tablas con InnoDB. – Daniel

2

puede evitar la obstrucción con algo como esto (pseudo-código):

create table temp like my_table; 
update logger to log in temp; 
alter table my_table add index new_index; 
insert into my_table select * from temp; 
update logger to log in my_table; 
drop table temp 

Dónde registrador sería lo agrega filas/actualizaciones a su mesa en el uso regular (ej .: script php). Esto configurará una tabla temporal para usar mientras la otra se actualiza.

+0

Supongo que debería haber mencionado que esta es una tabla de escritura frecuente. Entonces una tabla temporal será difícil pero no imposible de implementar. Solo un poco menos que ideal. – Richard

0

Intente asegurarse de que se crea el índice antes de se insertan los registros. De esta forma, el índice también se cumplirá durante la población de la tabla. Aunque tomará más tiempo, al menos estará listo cuando se realice la tarea de rake.

+0

La mayoría de los índices se crean de esta manera; sin embargo; contrariamente a la creencia popular, los asistentes de Oracle y Microsoft le dicen constantemente a sus DBA que reconstruyan sus índices cuando el rendimiento comienza a demorar. También en algunos casos de ETL, en realidad es más eficiente indexar más tarde. – Richard

Cuestiones relacionadas