设想情况:
我有一个包含1100万行的MySQL MyISAM表(table1),所有这些都希望复制到一个更好的表(table2,它有InnoDB引擎和适当的索引)。由于向MyISAM表添加索引所花费的时间太长,所以我希望遍历整个表并将每一行复制到新表中。
在MySQL中有办法做到这一点吗?
条件:
问题:
想法:
也许人们可以将其循环为MySQL语句,一次执行10000次或类似的操作?
这适用于一(1)条记录:
INSERT INTO products_indexed
SELECT * FROM products
WHERE products.p_product_id=(
SELECT products.p_product_id AS id FROM products
LEFT OUTER JOIN products_indexed ON (
products.p_product_id = products_indexed.p_product_id
)
WHERE products_indexed.p_product_id IS NULL
LIMIT 1
)然后,可以使用存储过程来循环:
BEGIN
DECLARE x INT;
SET x = 1;
WHILE x <= 1000000 DO
SET x = x + 1;
INSERT INTO products_indexed
SELECT * FROM products
WHERE products.p_product_id=(
SELECT products.p_product_id AS id FROM products
LEFT OUTER JOIN products_indexed ON (
products.p_product_id = products_indexed.p_product_id
)
WHERE products_indexed.p_product_id IS NULL
LIMIT 1
);
END WHILE;
END这可能不是最佳的循环方式,但这是一次尝试。似乎很有效,但我如何优化它呢?(可能会执行查询以获得几千行,然后执行插入操作?
发布于 2016-02-07 22:31:02
http://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html
To convert a non-InnoDB table to use InnoDB use ALTER TABLE:
ALTER TABLE table_name ENGINE=InnoDB;发布于 2016-02-08 04:38:51
看看pt-online-schema-change。它有一个例子来说明您所要寻找的内容:
pt-online-schema-change --alter "ENGINE=InnoDB" D=sakila,t=actor顾名思义,它将在没有锁定的情况下在线执行更改,方法是创建一个重复的表并作为最后一步执行原子重命名。
很难说您是否会遇到同样的锁定问题,但希望不会!
https://stackoverflow.com/questions/35259817
复制相似问题