我有一个非常大的表,并决定通过从另一个表引入一个带有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
填充它,然后删除列ml
和test_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);
它表演了四个小时,我不知道它是否会在可预见的时间内完成。我的问题是:这些查询是否正确,哪个更有效,还有其他方法可以做我需要的吗?
您的查询很慢,因为您在连接中使用的列没有索引,假设您拥有非常大量的数据。
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);
尝试添加索引,因为它还会减少将来查询的执行时间。