我需要用另一张表中的值更新一列...但是它需要永久或中止。可以在多个交易所(mic)上列出特定的证券(isin)...,所以我认为我需要在INNER JOIN ... ON(??)中有两个条件。我的以下尝试正确吗?我的表中大约有170,000条记录,其中有40,000个唯一的isins。
第一次尝试:
SQL:
SET SESSION SQL_BIG_SELECTS = 1;
UPDATE securities_live t1
INNER JOIN securities_prev t2
ON t1.isin = t2.isin AND t1.mic = t2.mic
SET t1.prev_close = t2.close;
第二次尝试:
SQL:
SET SESSION SQL_BIG_SELECTS = 1;
UPDATE securities_live t1
INNER JOIN securities_prev t2
ON (t1.isin = t2.isin AND t1.mic = t2.mic)
SET t1.prev_close = t2.close;
当前针对两个表的索引进行编辑:
Indexes (securities_live):
Primary|Unique=Yes|Packed=no|Column=id|Cardinality=166776|Collation=A
Indexes (securities_prev):
Primary|Unique=Yes|Packed=no|Column=id|Cardinality=166776|Collation=A
在两个表中,我在“ id”列上都有一个主键。所以例如在表Securities_live中“创建新索引”,一个用于isin列,另一个用于mic列?索引名称和索引类型(主,索引,唯一,全文)如何处理?大小?
答案 0 :(得分:2)
对于此查询:
UPDATE securities_live t1 INNER JOIN
securities_prev t2
ON t1.isin = t2.isin AND t1.mic = t2.mic
SET t1.prev_close = t2.close;
我建议在securities_prev(isin, mic, close)
上建立索引。
但是,我怀疑您正在更新所有或几乎所有记录。如果是这种情况,通常截断表并用insert
重新填充表通常更快。 Update
最好用于更新相对较少的行。
答案 1 :(得分:1)
正如评论者所指出的那样,由于已经设置了索引,因此我建议您尝试逐步进行这些操作。一次完成5k,直到完成。尝试10k。显然,您不能执行170k或40k。我曾经有很多次数据库拥有数百万行,而一次只能做到100k或更少。这是由于硬件的限制。
例如,
UPDATE top(1000) securities_live t1
INNER JOIN securities_prev t2
ON t1.isin = t2.isin AND t1.mic = t2.mic
SET t1.prev_close = t2.close;
您可能希望使用Order By,以便知道哪些记录是什么,并且需要跟踪已更新的内容。
在这里看到
how can I Update top 100 records in sql server
对不起,我刚刚读到您正在使用MySQL,
答案 2 :(得分:-2)
尝试一下:
SET SESSION SQL_BIG_SELECTS = 1;
UPDATE securities_live t1
INNER JOIN securities_prev t2
ON (t1.isin = t2.isin AND t1.mic = t2.mic)
SET t1.prev_close = t2.close;