tablas - MySQL copia eficientemente todos los registros de una tabla a otra
tablas grandes mysql (5)
¿Existe una forma más eficiente y menos laboriosa de copiar todos los registros de una tabla a otra que haciendo esto?
INSERT INTO product_backup SELECT * FROM product
Normalmente, la tabla de product
contendrá alrededor de 50,000 registros. Ambas tablas son idénticas en estructura y tienen 31 columnas en ellas. Me gustaría señalar que este no es el diseño de mi base de datos, he heredado un sistema heredado.
No creo que esto valga la pena para una tabla de 50k, pero: si tiene el volcado de la base de datos, puede volver a cargar una tabla desde ella. Como desea cargar una tabla en otra, puede cambiar el nombre de la tabla en el volcado con un comando sed: Aquí tiene algunas sugerencias: http://blog.tsheets.com/2008/tips-tricks/mysql-restoring-a-single-table-from-a-huge-mysqldump-file.html
Una alternativa (dependiendo de su diseño) sería utilizar desencadenantes en las inserciones de la tabla original para que la tabla duplicada también obtenga los datos.
Y una alternativa mejor sería crear otra instancia de MySQL y ejecutarla en una configuración maestro-esclavo o en un modo de descarga / descarga de esclavos.
Pienso que esta es la mejor manera de copiar registros de una tabla a otra tabla. De este modo, también se conservan los índices existentes de la tabla de destino.
Solo hay una cosa que te falta. Especialmente, si está utilizando InnoDB, es que desea agregar explícitamente una cláusula ORDER BY en su instrucción SELECT para asegurarse de que está insertando filas en el orden de la clave principal (índice agrupado):
INSERT INTO product_backup SELECT * FROM product ORDER BY product_id
Considere eliminar los índices secundarios en la tabla de respaldo si no son necesarios. Esto también ahorrará algo de carga en el servidor.
Finalmente, si está utilizando InnoDB, reduzca la cantidad de bloqueos de filas que se requieren y simplemente bloquee explícitamente ambas tablas:
LOCK TABLES product_backup WRITE;
LOCK TABLES product_id READ;
INSERT INTO product_backup SELECT * FROM product ORDER BY product_id;
UNLOCK TABLES;
Las cosas de bloqueo probablemente no supondrán una gran diferencia, ya que el bloqueo de filas es muy rápido (aunque no tan rápido como los bloqueos de tabla), pero desde que lo pidió.
DROP
la tabla de destino:
DROP TABLE DESTINATION_TABLE;
CREATE TABLE DESTINATION_TABLE AS (SELECT * FROM SOURCE_TABLE);
mysqldump -R --add-drop-table db_name table_name > filepath/file_name.sql
Esto tomará un volcado de las tablas especificadas con una opción de soltar para eliminar la tabla existente cuando la importe. entonces hazlo,
mysql db_name < filepath/file_name.sql