簡體   English   中英

MySQL從一個表緩慢復制到另一個表

[英]MySQL slow copy from one to another table

我使用以下語句將文件從一個數據庫復制到另一個數據庫:

INSERT INTO database1.table Select ... FROM database2.table

它工作得很好,但真的很慢。 對於400,000個數據庫(大約600mb),我花了幾個小時。

我正在使用MyISAM表來完成它。

我的主鍵是一個唯一的標識符,它是由不同的數據字段構建的。

我可以通過添加一個使用唯一標識符的新列來加快復制過程,假設一個整數從1開始並轉到最后一行並使其成為AUTO_INCREMENT,復制文件時它也會上升嗎? 或者可能在新列上設置索引?

如果你能幫助我加快復制過程,我真的很開心。

從一張桌子到另一張桌子的復制速度在很大程度上取決於很多東西,因此很難給出一個“這就是答案”。

脫離我的頭腦這里有一些可能是問題的事情:

  1. 您似乎正在從一個數據庫中的表復制到另一個數據庫中的表。 如果這兩個數據庫位於同一物理磁盤上,那么當磁盤搜索,讀取,搜索和寫入時,您將會有一些性能損失。
  2. 目標表是否有索引? 如果是這樣,MySQL可能在數據插入的同時編制索引。 這可能會大大減慢數據副本的速度。 禁用索引,復制數據,然后啟用索引會更快。
  3. MySQL有很多用於緩存,內存管理等的調優參數。 這些設置對於復制數據可能不是最理想的。 自從我使用MySQL以來已經有一段時間了,但我記得有一個數據調整工具可以讀取日志並告訴你性能命中的來源。

我使用過包含數十億行的數據庫。 當我不得不進行批量插入或批量復制時,索引是一個巨大的性能損失。 你沒有向我們展示表格的結構,但應該認真研究上面的#2。

第1步:如果可以,請停止使用糟糕的MyISAM引擎。 讀取速度非常快,但寫入性能可能很殘酷,並且通常整個表都會被鎖定以保持一致性,因為不支持事務。 InnoDB可以更好地處理並發寫入,並且具有記錄的額外好處,因此如果您的服務器沒有正確關閉,您的表不太可能完全被破壞。

步驟2:禁用目標表上的索引,或延遲創建它們,直到插入數據為止。 更新索引會增加大量開銷。 你這樣做是一次性插入,因此懲罰較低,但仍然不為零。

暫無
暫無

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

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