2

我很确定我做对了,但是我的查询已经在普通笔记本电脑上的 MySQL 数据库上运行了半个小时。“tweets”表只有 100 万条记录。

我想要什么?考虑表格“AAA”(左)和“BBB”(右)

id_str  text    id_str  text
------------    -------------------
13              13      foo bar baz
14              14      foobar
                13      foo bar baz
                17      foobaz

我想用表 B 中的文本填充表 A 的“文本”列:

UPDATE AAA
SET `text` = (
    SELECT `text` AS `text`
    FROM BBB
    WHERE id_str = AAA.id_str
    LIMIT 1
)

所以那个表 AAA 看起来像

id_str  text
-------------------
13      foo bar baz
14      foobar

但是,如前所述,此查询运行时间过长。我在它的语法上犯了错误吗?

4

2 回答 2

1
UPDATE AAA, BBB
SET AAA.`text` = BBB.text
WHERE BBB.id_str = AAA.id_str
于 2012-04-06T16:48:04.413 回答
1

如果我正确理解您的情况,这应该会更快:

UPDATE `AAA`,`BBB` SET `AAA`.`text`=`BBB`.`text`
WHERE `AAA`.`id_str`=`BBB`.`id_str`

您应该只需要运行一次此查询。它可能仍然需要几分钟,但这样做(使用 JOIN)仍然可能比运行 100 万个单独的查询要快得多。

AAA. id_strBBBid_str两者都应该被索引并且最好是相同的数据类型,例如两者都应该是 int(11)。这允许 MySQL 以最大的效率评估它们之间的相等关系。

编辑:正如我所说,上面概述的查询可能仍需要一些时间,具体取决于您的系统配置和硬件(操作可能是磁盘绑定的,即受硬盘速度的限制)。也可能是因为 MySQL 必须更新 table 中的索引AAA- 你能给我们看一个CREATE TABLEtable 语句AAA吗?或者,你可以试试这个:

CREATE TABLE `CCC` LIKE `AAA`;
INSERT INTO `CCC` SELECT `AAA`.`str_id`,`BBB`.`text` FROM `AAA` JOIN `BBB` ON `AAA`.`id` = `BBB`.`id`;

但是,这不会从旧表中复制任何数据AAA

于 2012-04-06T16:55:59.763 回答