簡體   English   中英

插入..Select到InnoDB表中,每次插入后都提交?

[英]Insert..Select into InnoDB table with commit after each insert?

我剛剛完成創建新的分區表,以替換舊的,未分區的表(為安全起見而重命名)。 在創建數據時,我已將舊表中的最新數據復制到新表中,但仍有大約一半的數據需要復制。 問題是,這是一個實時的Web服務,會不斷受到沖擊,每次我嘗試通過INSERT..SELECT復制塊時,它都堅持將其作為原子事務進行(這消耗了服務器的所有資源,將所有內容減慢到爬網,並可能使服務器危險地接近耗盡物理資源)。

只需清楚一點:OldTable是MyISAM。 NewTable是InnoDB,按其主鍵“ a”上的范圍進行分區。 兩個表具有相同的字段名稱。 字段本身並不相同,但是在不同之處,NewTable中的字段更大。

引起問題的查詢如下所示:

INSERT INTO NewTable (a,b,c,d,e,f,g) 
SELECT a,b,c,d,e,f,g 
FROM OldTable 
WHERE a > 300000000 AND a <= 400000000
order by a

我想要它做的是:在每次插入后提交,或者完全放棄事務完整性,如果發生臟讀,則允許它們發生。

鎖定NewTable(可能超出插入的單個行)是不可接受的。 鎖定OldTable很好,因為無論如何,別的東西都不再使用它了(當然,除了將SQL復制到新表之外,SQL也是如此)。

另外,是否有一種方法可以告訴MySQL以最低的優先級執行操作,並且僅在其(相對)空閑時間內完成任務?

除了減少一次插入的行數之外,還嘗試將bulk_insert_buffer_size系統變量的值bulk_insert_buffer_size更適合您的情況? 默認值為8MB。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM