MySql insert into select 查询太慢,无法复制 1 亿行

2023-12-22

我有一个由 100 多百万行组成的表,并且想要将数据复制到另一个表中。我有1个要求, 1. 查询执行不能阻塞对这些数据库表的其他操作, 我写了一个存储过程如下

我计算源表中的行数,然后进行循环,但在每次迭代中复制 10000 行,启动事务并提交它。然后按偏移量读取下一个 10000。

CREATE PROCEDURE insert_data()
BEGIN
  DECLARE i INT DEFAULT 0;
  DECLARE iterations INT DEFAULT 0;
  DECLARE rowOffset INT DEFAULT 0;
  DECLARE limitSize INT DEFAULT 10000;
  SET iterations = (SELECT COUNT(*) FROM Table1) / 10000;

  WHILE i <= iterations DO
    START TRANSACTION;
        INSERT IGNORE INTO Table2(id, field2, field3)
            SELECT f1, f2, f3
            FROM Table1
            ORDER BY id ASC
            LIMIT limitSize offset rowOffset;
    COMMIT;
    SET i = i + 1;
    SET rowOffset = rowOffset + limitSize;
  END WHILE;
END$$
DELIMITER ;

查询在不锁定表的情况下执行,但在复制几百万行后,它变得太慢了。 请建议任何更好的方法来完成这项任务。 感谢您!


Any INSERT ... SELECT ...查询确实获取共享锁 https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html在 SELECT 中从源表读取的行上。但通过处理较小的行块,锁不会持续太久。

查询与LIMIT ... OFFSET当您在源表中前进时,速度会越来越慢。如果每个块有 10,000 行,则需要运行该查询 10,000 次,每次都必须重新开始并扫描表以到达新的 OFFSET。

无论您做什么,复制 1 亿行都需要一段时间。它正在做很多工作。

我会用pt-归档器 https://www.percona.com/doc/percona-toolkit/LATEST/pt-archiver.html,一个为此目的设计的免费工具。它处理“块”(或子集)中的行。它将动态调整块的大小,以便每个块需要 0.5 秒。

您的方法和 pt-archiver 之间最大的区别是 pt-archiver 不使用LIMIT ... OFFSET,它沿着主键索引行走,按值而不是按位置选择行块。因此每个块的读取效率都会更高。


回复您的评论:

我预计,减小批量大小并增加迭代次数将会导致性能问题worse,不是更好。

原因是当你使用LIMIT with OFFSET,每个查询都必须从表的开头重新开始,并将行数计算到OFFSET价值。当您迭代表时,它会变得越来越长。

使用以下命令运行 20,000 个昂贵的查询OFFSET比运行 10,000 个类似查询需要更长的时间。最昂贵的部分不是读取 5,000 或 10,000 行,也不是将它们插入到目标表中。昂贵的部分将一遍又一遍地跳过约 50,000,000 行。

相反,您应该通过以下方式迭代表values不是通过偏移量。

INSERT IGNORE INTO Table2(id, field2, field3)
        SELECT f1, f2, f3
        FROM Table1
        WHERE id BETWEEN rowOffset AND rowOffset+limitSize;

循环之前,查询MIN(id)和MAX(id),然后开始rowOffset为最小值,然后循环至最大值。

这就是 pt-archiver 的工作方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySql insert into select 查询太慢,无法复制 1 亿行 的相关文章

  • 如何导出带有数据的 MySQL 架构?

    我有一个完整的架构 其中有许多表 其中包含 MySQL 查询浏览器中的数据 现在我想将这个包含所有表 数据的完整数据库发送给我的同事 我怎样才能将其发送给我的同事 以便他可以将这个完整的架构放入他的 MySQL 查询浏览器中 Thanks
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • 日期时间与时间戳字段

    我是 MySQL 数据库的新手 您是否建议在表创建中使用日期时间或时间戳字段以及原因 我正在使用 MySQL 5 7 和 innodb 引擎 Thanks 我会用TIMESTAMP对于任何需要自动管理的事情 因为它支持诸如ON UPDATE
  • 如何使用 Mysql Python 连接器检索二进制数据?

    如果我在 MySQL 中创建一个包含二进制数据的简单表 CREATE TABLE foo bar binary 4 INSERT INTO foo bar VALUES UNHEX de12 然后尝试使用 MySQL Connector P
  • PDO语法错误

    我在一个项目中使用 PDO 但提交时出现语法错误 这是我的代码
  • 获取mysql中逗号分隔行中不同值的计数

    一个表 Jobs 有 2 列 JobId 城市 当我们保存工作时 工作位置可能是多个城市 如下所示 JobId City 1 New York 2 New York Ohio Virginia 3 New York Virginia 我如何
  • 在同一查询中选择 Count of ip 和 Count of DISTINCT ip

    我有一个这样的表结构 TABLE NAME counter id datetime url ip 1 2013 04 12 13 27 09 url1 ip01 2 2013 04 13 10 55 43 url2 ip02 3 2013
  • 从 call_log 中获取最大并发通话数

    我需要帮助在 MySQL 5 0 77 中编写一个查询 根据下面所示的数据 办公室一天的通话量 返回并发电话呼叫的峰值数量 我只是想知道一天中任何特定时间同时打电话的人数最多是多少 首先 这是 MySQL 表 CREATE TABLE ca
  • 连接到 OpenShift (Redhat Paas) mysql 实例

    我正在尝试将我的 C 应用程序与 openshift 数据库连接 但我得到了这个例外conn Open Eccezione gt MySql Data MySqlClient MySqlException 0x80004005 Unable
  • meta_query,如何使用关系 OR 和 AND 进行搜索?

    已解决 请参阅下面的答案 我有一个名为的自定义帖子类型BOOKS 它有几个自定义字段 名称为 TITLE AUTHOR GENRE RATING 我该如何修复我的meta query下面的代码以便仅books在自定义字段中包含搜索词 tit
  • MySQL - 从数字列表中选择在表的 id 字段中没有对应项的数字

    我有一个数字列表 例如 2 4 5 6 7 我有一个表 foos 带有 foos ID 包括 1 2 3 4 8 9 我想获取我的号码列表 并在我的表的 ID 字段中找到那些没有对应项的号码 实现此目的的一种方法是创建一个表格栏 在 ID
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • Django 将 JSON 数据传递给静态 getJSON/Javascript

    我正在尝试从 models py 中获取数据并将其序列化为views py 中的 JSON 对象 模型 py class Platform models Model platformtype models CharField max len
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • 无法连接到 MAMP 上的 phpMyAdmin

    我收到此错误消息 MySQL 说道 无法连接 设置无效 phpMyAdmin 尝试连接 MySQL 服务器 但服务器拒绝连接 您应该检查配置中的主机 用户名和密码 并确保它们与 MySQL 服务器管理员提供的信息相对应 用户和通行证是默认的
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • 拥有更多列或更多行会更高效吗?

    我目前正在重新设计一个可能包含大量数据的数据库 我可以选择在数据库中包含许多不同的列或使用大量行 如果我在下面做一些大纲 可能会更容易 item id user id title description content category t
  • 重写 URL,将 ID 替换为查询字符串中的标题

    我对 mod rewrite 很陌生 但我做了一些搜索 但找不到这个问题的答案 我有一个网站 它只有一个 PHP 页面 根据查询字符串中传递给它的 ID 提供数十页内容 我想重写 URL 以便此 ID消失并替换为从数据库中提取的页面标题 例
  • 选择获取与 MySQL Group 中 max 对应的整行

    当我使用Max使用后查找特定 MySQL 组中字段的最大值GROUP BY 是否可以获取包含最大值的整行 我在处理一些论坛代码时偶然发现了这个线程 我想获取每个线程的最新帖子并将其显示在特定板的线程列表中 Quassnoi上面的回答对我非常
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的

随机推荐

  • 如何在不冒 OOM 杀手风险的情况下 mmap() 大文件?

    我有一个嵌入式 ARM Linux 机器 其 RAM 量有限 512MB 且没有交换空间 我需要在其上创建并操作一个相当大的文件 200MB 将整个文件加载到 RAM 中 修改 RAM 中的内容 然后再次将其写回有时会调用 OOM kill
  • 如何更改 xcode 4 中的文件路径?

    我有一个项目 其中有几个文件是红色的 在 XCode 3 中 我曾经单击文件 获取信息 并更改路径 但我不知道如何在新的 XCode 4 中执行此操作 单击您的文件 然后打开右侧窗格 右上角有一个按钮 在那里您将看到身份和类型 在位置下拉菜
  • 从 Java 中创建 SQL 批量更新

    我想更新 mySql 数据库中特定列上的每一行 目前我正在使用java sql PreparedStatement对于每一行并在 for 循环中迭代 我想知道在 Java 编程方面是否还有其他替代方案可以减少时间和资源消耗 比如批量执行准备
  • 内容安全策略指令“script-src”的源列表包含 safari Angular 5 中的无效源

    我已经在 Angular 5 中实现了 google recapthca 它对所有浏览器都运行良好 但在 safari 中我收到以下错误 内容安全策略指令 script src 的源列表包含无效源 strict dynamic 它将被忽略
  • 使用 jq 创建 JSON 文件

    我尝试通过执行以下命令来创建 JSON 文件 jq arg greeting world hello greeting gt file json 该命令在没有任何输入的情况下卡住了 尽管 jq n arg greeting world he
  • 如何从 Deno 运行任意 shell 命令?

    我想从 Deno 运行任意 bash 命令 就像使用child process在节点中 这在 Deno 中可能吗 Deno 1 28 0 添加了一个新的 API 来运行 shell 命令 Deno Command https deno la
  • 在 Weblogic Server 中使用 JAXB 解组

    具体规格 服务器 由客户修复的Weblogic 9 2 由客户修复的 wsdl 和 xsd 文件定义的 Web 服务 不允许修改 Hi 在项目中我们需要开发一个邮件系统 这必须与网络服务共同工作 我们创建一个 Bean 它从非根 xsd 元
  • 在 javascript 中检测同一应用程序打开的多个 chrome 选项卡

    有没有办法检测同一应用程序是否打开了多个浏览器选项卡 假设我有 www test com 并且我打开了该网站的 4 个选项卡 有没有办法检测 JavaScript 中打开的多个选项卡 你可以用我的sysend js 库 https gith
  • 获得 Vaadin 树物品的兄弟姐妹?

    我需要获取 Vaadin 树中特定项目的兄弟姐妹 我可以做这个 Object itemId event getItemId Object parentId tree getParent itemId Collection siblings
  • Haskell初学者,尝试输出一个列表

    我想这里的每个人都已经看过其中一个 或至少是类似的 问题 但我仍然需要问 因为我在任何地方都找不到这个问题的答案 主要是因为我不知道我到底应该看什么 为了 我写了这个小脚本 其中 printTriangle 应该打印出帕斯卡三角形 fac
  • 无法消除 Firefox 链接中的虚线轮廓?

    我有一个完整的 imgs 列表 ul li a href img src test png li gt a li li a href img src test png li gt a li li a href img src test pn
  • 单击按钮时获取 asyncfileupload 控件文件名

    我在我的 asp net 页面上使用 ajaxfileupload 控件 上传图像后 我调用 uploadcomplete 方法将图像保存在磁盘上并使用以下 JavaScript 在图像控件中显示 string fileName Guid
  • GCC LD NOLOAD 链接器部分生成可加载段

    我正在开发 Arm 裸机应用程序 并且我用以下标记标记了一些部分NOLOAD 根据中的解释了解嵌入式软件中的链接描述文件 NOLOAD 部分 https stackoverflow com q 57181652 6271889 我期望生成的
  • 使用 Google App Script 从不同帐户发送电子邮件

    我已经生成了代码应用程序脚本 https stackoverflow com questions 38231665 changing the owner of google spreadsheet for sending emails wi
  • Pandas 中的重新分配:复制还是查看?

    假设我们有以下数据框 df pd DataFrame A foo bar foo bar foo bar foo foo B one one two three two two one three C randn 8 D randn 8 如
  • 我的 php 标头标签不会重定向

    我尝试过进行研究 但看起来我并没有成功 我确保在标题标签之前没有内容打印到屏幕上 此页面获取上一个登录页面中的表单提供的信息 并使用该信息来确定应将用户重定向到哪个页面 不幸的是 看起来我的任何标头标签都没有重定向到任何内容 它只是停留在这
  • Selenium Web 驱动程序 chrome 异常元素此时不可点击

    我在 Web 元素 click 方法上遇到异常 元素在该点不可点击 其他元素将收到点击 在单击 Web 元素之前应用scrollTo javascript 方法 WebElement row List
  • 我可以使用 CDI 在 Jersey 1.x 中 @Inject 类吗?

    我想我是在问这个问题 但是对于 Jersey 1 x Jersey 2 0 的依赖注入 https stackoverflow com questions 16216759 dependency injection with jersey
  • 如何使用 wp_insert_post 在 WordPress 中设置 POST 永久链接/slug

    我正在使用编写简单的脚本wp insert post 在博客中发布文章 但这里有一个问题 我想提出Title and slugURL 不同 如何实现这一目标 例如 Title 如何让你的饮食取得成功 Slug 7 ways to make
  • MySql insert into select 查询太慢,无法复制 1 亿行

    我有一个由 100 多百万行组成的表 并且想要将数据复制到另一个表中 我有1个要求 1 查询执行不能阻塞对这些数据库表的其他操作 我写了一个存储过程如下 我计算源表中的行数 然后进行循环 但在每次迭代中复制 10000 行 启动事务并提交它