stored-procedures - 如何循环并复制MySQL大表的每一行?

标签 stored-procedures mysql

场景:

我有一个包含 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/

相关文章:

php - 我需要创建一个不刷新页面的 "vote"按钮

MYSQL:无法选择值,尽管我知道它们在那里

javascript - 从 yii 中的不同表中搜索

sql - 分区切换问题

sql-server - NVARCHAR(MAX) - 作为 SQL 存储过程输出参数

mysql - 创建一个达到最大执行时间的简单存储过程

javascript - 列表项中的jquery id?

mysql - 查找外键约束失败的行

mysql - 程序限制

sql-server - 使用大量来自 C# 的存储过程