我很确定我做得对,但我的查询现在已经在普通笔记本电脑上的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
但是,如上所述,此查询运行时间太长。我的语法错了吗?
答案 0 :(得分:1)
UPDATE AAA, BBB
SET AAA.`text` = BBB.text
WHERE BBB.id_str = AAA.id_str
答案 1 :(得分:1)
如果我理解你的情况,这应该快得多:
UPDATE `AAA`,`BBB` SET `AAA`.`text`=`BBB`.`text`
WHERE `AAA`.`id_str`=`BBB`.`id_str`
您只需运行此查询一次。它可能仍需要几分钟,但这样做(使用JOIN)仍然可能比运行100万个单独查询要快得多。
AAA
。id_str
和BBB
。id_str
都应该被编入索引,并且最好是相同的数据类型,例如两者都应该是int(11)。这允许MySQL以最高效率评估它们之间的相等关系。
AAA
中的索引 - 您能否向我们展示表CREATE TABLE
的{{1}}语句?或者,你可以试试这个:
AAA
但是,这不会复制旧表CREATE TABLE `CCC` LIKE `AAA`;
INSERT INTO `CCC` SELECT `AAA`.`str_id`,`BBB`.`text` FROM `AAA` JOIN `BBB` ON `AAA`.`id` = `BBB`.`id`;
中的任何数据。