SQL - 更新列条目的更快方法

时间:2015-06-21 04:28:26

标签: mysql database

我有一个类似于以下内容的SQL表:

id | text | other_columns...
----------------------------
 0 |  a   |      ...
 1 |  b   |      ...
 2 |  c   |      ...

我需要对text列中的值应用一些复杂的操作,然后使用新值更新字段。

 // Get all the current values.
 entries = SELECT id,text FROM foo_table;

 // Apply some complex operation to the text values (this part is Python, not SQL).
 foreach entry in entries
     entry.text = f(entry.text)

 // Update the text fields (1 UPDATE per entry).
 foreach entry in entries
     UPDATE foo_table SET text=entry.text WHERE id=entry.id;

这会产生一个这样的表格,其中包含更新的文本值:

id | text | other_columns...
----------------------------
 0 |  x   |      ...
 1 |  y   |      ...
 2 |  z   |      ...

每UPDATE大约需要1毫秒,我有大约0.5百万个条目,这导致大约8分钟的执行。我正在批处理SQL命令(一次1000个),但这似乎仍然很慢/效率低。

有更好(更快)的方法吗?感谢。

3 个答案:

答案 0 :(得分:2)

通过OUTFILE导出导出到包含2列的txtfile。

SELECT id, theText
  INTO OUTFILE '/path/to/file.csv'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM myTable

让Py做出来。

可以有2列或3.我们说3用于调试目的。

现在你有了。将带有INFILE的mysql带回到id为newText的工作表中。

    LOAD DATA INFILE 'data.txt' INTO TABLE worktable
  FIELDS TERMINATED BY ',' ENCLOSED BY '"'
      LINES TERMINATED BY '\r\n';

https://dev.mysql.com/doc/refman/5.1/en/load-data.html

请注意,要导入的数据可以包含带有列名的row1。当然,可以跳过Row1进行数据导入,但是通过命名列只会引入某些列。在你的情况下,3列中的2列。

导入后在worktable.id上添加索引。

更新速度很快。

UPDATE myTable
JOIN worktable
ON worktable.id=myTable.id
SET myTable.text=worktable.newText

这一切都可以在一个封闭的bash脚本中发生。如果不确定请问请问。

答案 1 :(得分:1)

我可能会错过这里的大事,但为什么你不能做到

Update foo_table;
Set foo_table.text = f(foo_table.text)

答案 2 :(得分:1)

您可以使用UDF,但必须在C中重写您的功能。