【问题标题】:Quickly copying all values from one table into another – MySQL快速将一个表中的所有值复制到另一个表中——MySQL
【发布时间】:2015-03-14 07:37:08
【问题描述】:

假设我有两个具有 BTREE 索引的表,它们具有相同的行数但不一定共享数据,并且我想将一个表中的一个列中的值复制到另一个表中。我已经看到other 问题的answers 涉及为两个表生成顺序 ID 的 SELECTing,然后基于将这些 ID 匹配在一起执行一些 JOIN 操作。例如(来自第一个答案):

select result1.title1, title1.age1,result2.title2, title2.age2 from 
  (select @i:=@i+1 AS rowId, title1, age1 from tab1,(SELECT @i:=0) a) as result1 , 
  (select @j:=@j+1 AS rowId,title2, age2 from tab2,(SELECT @j:=0) a ) as result2 
where 
  result1.rowId = result2.rowId; #sic.

但是,我有两个担忧:

  1. 我不确定如何以这种方式更新,因为我不知道是否可以即时为目标表创建一个虚拟列(即相当于 UPDATE (SELECT (@x:=@x+1), title1 FROM title1,(SELECT @x:=0) a ) INNER JOIN... 的东西)。
  2. 我怀疑这是在O(n^2) 时间关于行数。如果首先生成虚拟 ID,然后每次运行 JOIN 都需要对一个或两个表进行线性搜索,就会出现这种情况。是这样吗?如果是这样,有没有更快的方法来做到这一点?

例如,考虑以下两个表:

CREATE TABLE t1 (
    id INT NOT NULL PRIMARY KEY,
    v INT
);
INSERT INTO t1 VALUES
    (1, 3),
    (3, 4),
    (25, 7);

CREATE TABLE t2 LIKE t1;

INSERT INTO t2 VALUES
    (6, 150),
    (9, 143),
    (14, 175);

假设我想在一个查询中将t2 中的v 值替换为t1 中的值,以便t1 变为:

mysql> SELECT * FROM t1;
+----+------+
| id | v    |
+----+------+
|  1 |  150 |
|  3 |  143 |
| 25 |  175 |
+----+------+
3 rows in set (0.00 sec)

我该怎么做?

【问题讨论】:

  • 请为每个表提供SHOW CREATE TABLE,并告诉我们哪一列将一个表中的一行与另一个表中的对应行相关联。

标签: mysql join sql-update


【解决方案1】:

经过大量测试,我认为我找到了一个非常可行的解决方案。如果您在源表上有顺序 ID,则可以使用以下 [诚然有些不寻常] 查询相对快速地将值复制到目标表(尤其是在源表为 ENGINE=MEMORY 的情况下):

UPDATE t1 CROSS JOIN (SELECT @x:=0) a 
    SET t1.v=(@x:=@x+1)+(SELECT v FROM t2 WHERE id=@x)-@x;

但是,SELECT v... 语句的开销非常大,并且会显着减慢查询速度。

【讨论】:

    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    相关资源
    最近更新 更多