场景:
我有一个包含 1100 万行的 MySQL MyISAM 表(表 1),我想将所有这些行复制到一个更好的表(表 2,它具有 InnoDB 引擎以及适当的索引)。由于向 MyISAM 表添加索引需要太长时间,因此我想循环遍历整个表并将每一行复制到新表中。
有没有办法在 MySQL 中做到这一点?
条件:
- 此操作没有时间限制(可以“缓慢”循环)。
- 这些表具有相同的列。
- table1 在线并且需要保持在线(一直在读取;我暂时暂停了写入)。
问题:
- MySQL 服务器是共享主机(无文件系统访问权限)。
- Mysqldump 超时。
- 添加索引超时。
- 仅插入上一个表的选择会超时。
想法:
也许可以将其作为 MySQL 语句进行循环,一次执行 10 000 次或类似的操作?
这适用于一 (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
这可能不是最好的循环方式,但它是一种尝试。看起来可行,但是我该如何优化它呢? (也许执行查询来获取几千行,然后执行插入?
最佳答案
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;
关于stored-procedures - 如何循环并复制MySQL大表的每一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35259817/