内部联接多个属性不起作用

时间:2018-07-03 13:40:06

标签: mysql sql join inner-join

我需要用另一张表中的值更新一列...但是它需要永久或中止。可以在多个交易所(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列?索引名称和索引类型(主,索引,唯一,全文)如何处理?大小?

3 个答案:

答案 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,

MySQL - UPDATE query with LIMIT

答案 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;