百萬級資料插入的優化

2022-07-17 03:51:07 字數 1919 閱讀 3387

mysql中插入乙個記錄需要的時間由下列因素組成,其中的數字表示大約比例:

如果我們每插入一條都執行乙個sql語句,那麼我們需要執行除了連線和關閉之外的所有步驟n次,這樣是非常耗時的,優化的方式有一下幾種:

在每個insert語句中寫入多行,批量插入

將所有查詢語句寫入事務中

利用load data匯入資料

每種方式執行的效能如下。

innodb 給 mysql 提供了具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (acid compliant))型表。innodb 提供了行鎖(locking on row level)以及外來鍵約束(foreign key constraints)。

innodb 的設計目標是處理大容量資料庫系統,它的 cpu 利用率是其它基於磁碟的關聯式資料庫引擎所不能比的。在技術上,innodb 是一套放在 mysql 後台的完整資料庫系統,innodb 在主記憶體中建立其專用的緩衝池用於高速緩衝資料和索引。

macbook air 12mid apache2.2.26 php5.5.10 mysql5.6.16

總數100w條資料

插入完後資料庫大小38.6mb(無索引),46.8(有索引)

myisam 是mysql預設存貯引擎。設計簡單,支援全文搜尋。

macbook air 12mid apache2.2.26 php5.5.10 mysql5.6.16

總數100w條資料

插入完後資料庫大小19.1mb(無索引),38.6(有索引)

我測試的資料量不是很大,不過可以大概了解這幾種插入方式對於速度的影響,最快的必然是load data方式。這種方式相對比較麻煩,因為涉及到了寫檔案,但是可以兼顧記憶體和速度。

引用:二、php+mysql百萬資料插入

第一種方法:使用insert into 插入,**如下:

最後顯示為:23:25:05 01:32:05 也就是花了2個小時多! 這是時間擼幾把 都行。。。

第二種方法:使用事務提交,批量插入資料庫(每隔10w條提交下)

最後顯示消耗的時間為:22:56:13 23:04:00 ,一共8分13秒  ,**如下:

時間是一下縮短不少但還是有點長。

第三種方法:使用優化sql語句:將sql語句進行拼接,使用 insert into table () values  (),(),(),()然後再一次性插入,如果字串太長,

則需要配置下mysql,在mysql 命令列中執行 :set global max_allowed_packet =  2*1024*1024*10;消耗時間為:11:24:06 11:24:11;

我擦 插入200w條測試資料僅僅用了不到6秒鐘!**如下:

可能這裡又會有人說資料不大 sql檔案匯出來也是小200m 5秒鐘 對一** 進行200萬條資料 速度已經不錯了。

這個再跟大家說乙個 tp框架了的 addall方法 

速度也很快 但是還不如原生。

著了說一下其中可能會遇到的問題  比如試驗時可能會出現php記憶體限制 和mysql的sql語句溢位甚至宕機

這裡數幾個方案 

1、可以進行相關的配置php.ini  my.ini 等

2、大家可以用佇列進行分批處理

3、或者自己的一些方法

千萬級 百萬級資料刪除優化

在mysql上面刪除大量資料 千萬級 由於不是清空資料,故不能使用truncate 語句 有個truncate可參考 mysql delete語句與truncate table語句 在正常delete下,刪除十分緩慢 由於索引的原因,每次刪除都要相應的更新索引,越往後索引碎片越多,即越往後越慢 完整...

千萬級 百萬級資料刪除優化

在mysql上面刪除大量資料 千萬級 由於不是清空資料,故不能使用truncate 語句 有個truncate可參考 mysql delete語句與truncate table語句 在正常delete下,刪除十分緩慢 由於索引的原因,每次刪除都要相應的更新索引,越往後索引碎片越多,即越往後越慢 完整...

百萬級資料庫優化方案

1.對查詢進行優化,要盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。2.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如 select id from t where num is null 複製 最好...