我希望将数百万行表中的一些数据传输到另一个表中。我面临的问题是:
INSERT INTO ... SELECT ...
,因为将所有这些行放入临时表会导致服务器崩溃所以我基本上认为我应该做一个存储过程或类似的东西,一次需要100行,然后将它们插入到另一个表中。
关于这个问题的解决方案/最佳实践的任何想法?
谢谢,
答案 0 :(得分:2)
您可以使用SELECT INTO OUTFILE:
SELECT * INTO OUTFILE 'backup.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM <tablename> WHERE <conditions> <Other Clause if required>
然后插入:
LOAD DATA INFILE 'backup.csv'
INTO TABLE <tablename>
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(field1,field1,field2) etc
答案 1 :(得分:0)
您的更新频率是多少?
如果您不需要跟踪更新,则可以使用限制。我在过去的函数(VB.net)中写过,等到行= 0:
Function ExecCommandInParts(ByVal sql As String, Optional ByVal Updater As Func(Of Integer, Integer) = Nothing) As Integer
Dim limit As Integer = 10000
Dim count As Integer = limit
While count = limit
count = ExecCommandWithTimeout(sql & " limit " & limit)
If Updater IsNot Nothing Then Updater(count)
End While
End Function
要运行的SQL = sql查询(INSERT ... SELECT,DELETE ...) Updater = delegate更新调用者对象/用户命令的状态是什么......
ExecCommandWithTimeout =执行SQL的函数,等待500毫秒。
在繁重的生产服务器中测试,有效。