多属性内部连接不起作用

neskvpey  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(372)

我需要用另一个表中的值更新列。。。但它需要永远或中止。可以在多个交易所(mic)列出特定的证券(isin)。。。所以我想我需要有两个条件在内部连接。。。在(??)上。我的尝试是否正确?我在表中有大约170000条记录,其中有40000个独立的isin。
第一次尝试:

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\u live中,为isin列和mic列创建一个新索引?索引名和索引类型(primary、index、unique、fulltext)如何?大小?

6ojccjat

6ojccjat1#

正如评论人士所指出的,既然你已经设置了索引,我建议你试着做这些零碎的工作。每次跑5公里,直到完成为止。试试10公里。显然你不能做170k或40k。我曾经有过很多次,一个数据库有数百万行,而我一次只能找到10万行或更少的行。这是因为硬件的限制。
例如,

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,这样您就知道哪些记录是什么,并且需要跟踪哪些记录已更新。
看这里,
如何更新sql server中的前100条记录
抱歉,我刚看到你在用mysql,
mysql-带限制的更新查询

hec6srdp

hec6srdp2#

对于此查询:

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 最好用于更新相对较少的行。

sxissh06

sxissh063#

试试这个:

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;

相关问题