从另一个表更新新列:太慢了

问题描述 投票:1回答:1

我有一个非常大的表,并决定通过从另一个表引入一个带有ID的新列并删除另外两列来减小它的大小。以下是表格:

Table tests:
+---------------+----------------------+------+-----+---------+----------------+
| Field         | Type                 | Null | Key | Default | Extra          |
+---------------+----------------------+------+-----+---------+----------------+
| id            | bigint(20) unsigned  | NO   | PRI | NULL    | auto_increment |
| ml            | varchar(16)          | NO   |     | NULL    |                |
| test_num      | smallint(5) unsigned | NO   |     | NULL    |                |
........                                                                                                                   

Table data:
+-----------+----------------------+------+-----+---------+----------------+
| Field     | Type                 | Null | Key | Default | Extra          |
+-----------+----------------------+------+-----+---------+----------------+
| id        | bigint(20) unsigned  | NO   | PRI | NULL    | auto_increment |
| test_id   | bigint(20) unsigned  | NO   |     | NULL    |                |                                                                                                                   
| ml        | varchar(16)          | NO   |     | NULL    |                |                                                                                                                   
| test_num  | smallint(5) unsigned | NO   |     | NULL    |                |                                                                                                                   
........

所以我在表test_id中添加了新的列data,并希望用id中的tests填充它,然后删除列mltest_num

我试过用join做到这一点:

update data join tests 
    on data.ml=tests.ml 
    and data.test_num=tests.test_num 
    set test_id=tests.id;

这个查询工作了三个小时,所以我取消了它并尝试了另一个:

update data 
    set test_id=
    (select id from tests 
    where data.ml=tests.ml 
    and data.test_num=tests.test_num);

它表演了四个小时,我不知道它是否会在可预见的时间内完成。我的问题是:这些查询是否正确,哪个更有效,还有其他方法可以做我需要的吗?

mysql
1个回答
1
投票

您的查询很慢,因为您在连接中使用的列没有索引,假设您拥有非常大量的数据。

Alter Table tests ADD INDEX idx_ml(ml),ADD INDEX idx_test_num(test_num);
Alter Table data ADD INDEX idx_ml(ml),ADD INDEX idx_test_num(test_num);

尝试添加索引,因为它还会减少将来查询的执行时间。

© www.soinside.com 2019 - 2024. All rights reserved.