Necesito crear un índice en una tabla MySQL de ~ 5M filas. Es una tabla de producción, y temo un bloque completo de todo si ejecuto una declaración CREATE INDEX ...
¿Hay alguna forma de crear ese índice sin bloquear inserciones y selecciones?
¡Me pregunto si no tengo que detenerme, crear un índice y reiniciar mi sistema!
mysql
indexing
production
alter-table
table-locking
nocturno
fuente
fuente
Respuestas:
Actualización [2017]: MySQL 5.6 admite actualizaciones de índices en línea
https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html#online-ddl-index-syntax-notes
[2015] Actualización de tablas de índices de escritura de bloques en MySQL 5.5
De la respuesta anterior:
Esto es **** FALSE **** (al menos para las tablas MyISAM / InnoDB, que es lo que usa el 99,999% de la gente. Clustered Edition es diferente).
Hacer operaciones de ACTUALIZAR en una tabla se BLOQUEARÁ mientras se crea el índice. MySQL es muy, muy estúpido sobre esto (y algunas otras cosas).
Guión de prueba:
Mi servidor (InnoDB):
Salida (observe cómo la sexta operación se bloquea durante los ~ 400ms que se necesitan para finalizar la actualización del índice):
Vs operaciones de lectura que no bloquean (intercambie el comentario de línea en el script):
Actualización del esquema de MySQL sin tiempo de inactividad
Hasta ahora, solo conozco un método para actualizar un esquema MySql y no sufrir una interrupción de disponibilidad. Maestros circulares:
Una manera fácil de actualizar el esquema no lo es. Funcionable en un entorno de producción serio; sí lo es. Por favor, por favor, por favor, si hay una manera más fácil de agregar un índice a una tabla MySQL sin bloquear escrituras, hágamelo saber.
Buscar en Google me llevó a este artículo que describe una técnica similar. Aún mejor, recomiendan beber en el mismo punto del procedimiento (tenga en cuenta que escribí mi respuesta antes de leer el artículo).
Pt-online-schema-change de Percona
El artículo que vinculé anteriormente habla sobre una herramienta, pt-online-schema-change , que funciona de la siguiente manera:
Yo nunca probé la herramienta. YMMV
RDS
Actualmente estoy usando MySQL a través del RDS de Amazon . Es un servicio realmente ingenioso que concluye y administra MySQL, lo que le permite agregar nuevas réplicas de lectura con un solo botón y actualizar de forma transparente la base de datos en todos los SKU de hardware. Es realmente conveniente. No tienes acceso SUPER a la base de datos, por lo que no puedes jugar con la replicación directamente (¿es esto una bendición o una maldición?). Sin embargo, puede usar Promoción de réplica de lectura para realizar cambios en el esquema en un esclavo de solo lectura y luego promover ese esclavo para que se convierta en su nuevo maestro. Exactamente el mismo truco que describí anteriormente, pero mucho más fácil de ejecutar. Todavía no hacen mucho para ayudarte con el corte. Tienes que reconfigurar y reiniciar tu aplicación.
fuente
Como se describe en esta publicación de blog , el
ALTER TABLE
mecanismo InnoDB se ha rediseñado por completo para MySQL 5.6.(Para obtener una descripción general exclusiva de este tema, la documentación de MySQL puede proporcionar una lectura de la tarde).
Para agregar un índice a una tabla sin un bloqueo resultante en
UPDATE
/INSERT
, se puede usar el siguiente formato de declaración:fuente
Actualización de MySQL 5.6 (febrero de 2013): ahora puede realizar operaciones de lectura y escritura mientras se crea un índice incluso con tablas InnoDB: http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index -overview.html
y:
de http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_fast_index_creation
fuente
pt-online-schema-change es el camino a seguir si realmente quiere asegurarse de que la migración no colapse el sitio.
Como escribí en el comentario anterior, tengo varias experiencias con pt-online-schema-change en producción. Tenemos nuestra tabla principal de más de 20 millones de registros y un maestro -> 2 esclavos de replicación de solo lectura. He realizado al menos una docena de migraciones con pt-online-schema-change desde agregar una nueva columna, cambiar el juego de caracteres, hasta agregar varios índices. También atendemos toneladas de tráfico durante el tiempo de migración y no hemos tenido ningún contratiempo. Por supuesto, tendría que probar todos los scripts muy a fondo antes de ejecutarlos en producción.
Intenté agrupar los cambios en 1 secuencia de comandos para que pt-online-schema-change solo tenga que copiar los datos una vez. Y tenga mucho cuidado al cambiar el nombre de la columna, ya que perderá sus datos. Sin embargo, agregar un índice debería estar bien.
fuente
pt-online-schema-change
. Es genial, pero es excesivo para muchas situaciones en las que las capacidades DDL en línea de MySQL 5.6 + ya funcionan bien. También tiene limitaciones (como no jugar bien con los disparadores) y duplica la cantidad de escritura necesaria por inserción en la tabla original mientras se realiza un cambio de esquema. Gravará su disco significativamente más que un cambio de esquema en línea ordinario, y por lo tanto tiene el potencial de "derribar su sitio" en circunstancias en las que simplemente ejecutar el cambio de esquema de la manera simple hubiera funcionado bien.pt-online-schema-change
es una herramienta útil, hay muchas situaciones en las que el DDL en línea ordinario es igual de bueno y un puñado en el que es mejor, por lo que cualquier recomendación debe ser cuidadosamente advertida en lugar de universal.