首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何循环遍历和复制大型MySQL表的每一行?

问如何循环遍历和复制大型MySQL表的每一行?
EN

Stack Overflow用户
提问于 2016-02-07 22:15:28
回答 2查看 771关注 0票数 0

设想情况:

我有一个包含1100万行的MySQL MyISAM表(table1),所有这些都希望复制到一个更好的表(table2,它有InnoDB引擎和适当的索引)。由于向MyISAM表添加索引所花费的时间太长,所以我希望遍历整个表并将每一行复制到新表中。

在MySQL中有办法做到这一点吗?

条件:

  • 这一行动没有时间限制(可以“缓慢地”循环)。
  • 这些表有相同的列。
  • table1是在线的,需要保持在线(一直在阅读;我暂时停止了写作)。

问题:

  • MySQL服务器是一个共享主机(没有文件系统访问)。
  • Mysqldump超时了。
  • 添加索引超时。
  • 只需插入上一个表的选择就可以超时。

想法:

也许人们可以将其循环为MySQL语句,一次执行10000次或类似的操作?

这适用于一(1)条记录:

代码语言:javascript
复制
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
)

然后,可以使用存储过程来循环:

代码语言:javascript
复制
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

这可能不是最佳的循环方式,但这是一次尝试。似乎很有效,但我如何优化它呢?(可能会执行查询以获得几千行,然后执行插入操作?

EN

回答 2

Stack Overflow用户

发布于 2016-02-07 22:31:02

http://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html

代码语言:javascript
复制
To convert a non-InnoDB table to use InnoDB use ALTER TABLE:

ALTER TABLE table_name ENGINE=InnoDB;
票数 0
EN

Stack Overflow用户

发布于 2016-02-08 04:38:51

看看pt-online-schema-change。它有一个例子来说明您所要寻找的内容:

代码语言:javascript
复制
pt-online-schema-change --alter "ENGINE=InnoDB" D=sakila,t=actor

顾名思义,它将在没有锁定的情况下在线执行更改,方法是创建一个重复的表并作为最后一步执行原子重命名。

很难说您是否会遇到同样的锁定问题,但希望不会!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35259817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档