加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL高效的表复制

发布时间:2022-10-15 09:01:23 所属栏目:MySql教程 来源:转载
导读: MySQL高效的表复制
mysql
MySQL高效的表复制,mysql,Mysql,我有一个相对昂贵的过程,需要一个“自连接”,这会阻塞我的计算时间。考虑下面的脚本:CREATE TEMPORARY TABLE tempdb.table1SEL

MySQL高效的表复制

mysql

MySQL高效的表复制,mysql,Mysql,我有一个相对昂贵的过程,需要一个“自连接”,这会阻塞我的计算时间。考虑下面的脚本:CREATE TEMPORARY TABLE tempdb.table1SELECT * FROM db.sometable WHERE {condition};ALTER TABLE tempdb.table1 ADD INDEX idx_t({columns for join});CREATE TEMPORARY TABLE tempdb.table2SELECT * FROM tempdb.tab

我有一个相对昂贵的过程,需要一个“自连接”MySQL 复制表,这会阻塞我的计算时间。考虑下面的脚本:

CREATE TEMPORARY TABLE tempdb.table1
SELECT * FROM db.sometable WHERE {condition};
ALTER TABLE tempdb.table1 ADD INDEX idx_t({columns for join});
CREATE TEMPORARY TABLE tempdb.table2
SELECT * FROM tempdb.table1;
ALTER TABLE tempdb.table2 ADD INDEX idx_t({columns for join});

在这种情况下,我需要计算索引两次,然后才能尝试连接。如果我使用“LIKE”操作符创建第二个表,那么新表将使用索引结构创建,但在填充表时仍需要处理

是否有办法在一个步骤中完全复制表、索引和所有内容?它将大大缩短计算时间,因为它只需要为这个新表找到内存,而不是重新生成大量计算。正如评论中提到的,这是我在各种应用程序中经常遇到的问题。我提出这个问题的目的不是优化某个特定的应用程序,而是希望获得有关此问题的一般信息。

使用您提到的“LIKE”操作符创建表。然后,在从源表复制数据之前禁用索引。大概是这样的:

CREATE TABLE destdb.table1 LIKE srcdb.table1;
ALTER TABLE destdb.table1 DISABLE KEYS;
INSERT INTO destdb.table1 SELECT * FROM srcdb.table1;
ALTER TABLE destdb.table1 ENABLE KEYS;

您可以在不创建临时表的情况下优化原始查询。你应该问另一个问题,包括你想要优化的查询。@GordonLinoff这是一个我经常遇到的问题,不管具体的上下文如何。所以我对这个问题比一般的优化方法更感兴趣。@jamesselmore。有趣。“我几乎从不需要创建临时表来优化查询。@GordonLinoff,另一个阻碍我发布完整脚本的问题是,应用程序/逻辑不是我可以共享的,因为它是为我的雇主工作的。”。如果你能在没有临时表的情况下完成必要的任务,我会非常惊讶,你肯定激发了我的兴趣。我将看看是否有一种方法可以重新设置脚本的上下文,这样我就不会有任何保留。当我重新启用密钥时,它是否仍然需要重新处理所有内容?不清楚这是否解决了问题,而是将其分为两个不同的步骤。启用索引将创建索引数据。您无法避免这种情况,但通过在插入之前禁用索引,可以获得更好的性能。Insert将更快,因为它不需要为每次插入更新索引。如果您的表有外键,您还可以禁用外键并获得更好的性能。好的,但这与我上面写的有什么不同?在这里,我写入第二个表,然后应用indexe。这个脚本在任何情况下都可以工作。我不需要知道源表中有哪些索引。这不是我的重点/关注点。我的观点是,我提供了一个解决方案,在这个解决方案中,我复制表而不使用任何键或索引,然后使用alter语句创建它们。您建议我创建一个禁用键的重复表,插入数据,然后重新激活键。听起来好像没有计算上的差异。这是正确的吗?

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!