久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

大數據量的情況下MySQL插入方法的性能比較

140次閱讀
沒有評論

共計 2840 個字符,預計需要花費 8 分鐘才能閱讀完成。

這篇文章主要講解了“大數據量的情況下 MySQL 插入方法的性能比較”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“大數據量的情況下 MySQL 插入方法的性能比較”吧!

插入分析

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

連接:(3)

發(fā)送查詢給服務器:(2)

分析查詢:(2)

插入記錄:(1x 記錄大小)

插入索引:(1x 索引)

關閉:(1)

如果我們每插入一條都執(zhí)行一個 SQL 語句,那么我們需要執(zhí)行除了連接和關閉之外的所有步驟 N 次,這樣是非常耗時的,優(yōu)化的方式有一下幾種:

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

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

利用 Load Data 導入數據

每種方式執(zhí)行的性能如下。

Innodb 引擎

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

InnoDB 的設計目標是處理大容量數據庫系統(tǒng),它的 CPU 利用率是其它基于磁盤的關系數據庫引擎所不能比的。在技術上,InnoDB 是一套放在 MySQL 后臺的完整數據庫系統(tǒng),InnoDB 在主內存中建立其專用的緩沖池用于高速緩沖數據和索引。

測試環(huán)境

Macbook Air 12mid apache2.2.26 php5.5.10 mysql5.6.16

總數 100W 條數據

插入完后數據庫大小 38.6MB(無索引),46.8(有索引)

無索引單條插入 總耗時:229s 峰值內存:246KB

有索引單條插入 總耗時:242s 峰值內存:246KB

無索引批量插入 總耗時:10s 峰值內存:8643KB

有索引批量插入 總耗時:16s 峰值內存:8643KB

無索引事務插入 總耗時:78s 峰值內存:246KB

有索引事務插入 總耗時:82s 峰值內存:246KB

無索引 Load Data 插入 總耗時:12s 峰值內存:246KB

有索引 Load Data 插入 總耗時:11s 峰值內存:246KB

MyIASM 引擎

MyISAM 是 MySQL 缺省存貯引擎。設計簡單,支持全文搜索。

測試環(huán)境

Macbook Air 12mid apache2.2.26 php5.5.10 mysql5.6.16

總數 100W 條數據

插入完后數據庫大小 19.1MB(無索引),38.6(有索引)

無索引單條插入 總耗時:82s 峰值內存:246KB

有索引單條插入 總耗時:86s 峰值內存:246KB

無索引批量插入 總耗時:3s 峰值內存:8643KB

有索引批量插入 總耗時:7s 峰值內存:8643KB

無索引 Load Data 插入 總耗時:6s 峰值內存:246KB

有索引 Load Data 插入 總耗時:8s 峰值內存:246KB

總結

我測試的數據量不是很大,不過可以大概了解這幾種插入方式對于速度的影響,最快的必然是 Load Data 方式。這種方式相對比較麻煩,因為涉及到了寫文件,但是可以兼顧內存和速度。

測試代碼

?php $dsn =  mysql:host=localhost;dbname=test  $db = new PDO($dsn, root , ,array(PDO::ATTR_PERSISTENT =  true)); // 刪除上次的插入數據  $db- query(delete from `test`  // 開始計時  $start_time = time(); $sum = 1000000; //  測試選項  $num = 1; if ($num == 1){ //  單條插入  for($i = 0; $i   $sum; $i++){ $db- query( insert into `test` (`id`,`name`) values ($i, tsetssdf)  } } elseif ($num == 2) { //  批量插入,為了不超過 max_allowed_packet,選擇每 10 萬插入一次  for ($i = 0; $i   $sum; $i++) { if ($i == $sum - 1) { //*** 一次  if ($i%100000 == 0){ $values =  ($i,  testtest)  $db- query(insert into `test` (`id`, `name`) values $values  } else { $values .=  ,($i,  testtest)  $db- query(insert into `test` (`id`, `name`) values $values  } break; } if ($i%100000 == 0) { // 平常只有在這個情況下才插入  if ($i == 0){ $values =  ($i,  testtest)  } else { $db- query( insert into `test` (`id`, `name`) values $values  $values =  ($i,  testtest)  } } else { $values .=  ,($i,  testtest)  } } } elseif ($num == 3) { //  事務插入  $db- beginTransaction(); for($i = 0; $i   $sum; $i++){ $db- query( insert into `test` (`id`,`name`) values ($i, tsetssdf)  } $db- commit(); } elseif ($num == 4) { //  文件 load data $filename = dirname(__FILE__). /test.sql  $fp = fopen($filename,  w  for($i = 0; $i   $sum; $i++){ fputs($fp,  $i, testtest \r\n  } $db- exec(load data infile  $filename  into table test fields terminated by  ,  } $end_time = time(); echo  總耗時 , ($end_time - $start_time),  秒 \n  echo  峰值內存 , round(memory_get_peak_usage()/1000),  KB\n  ?

感謝各位的閱讀,以上就是“大數據量的情況下 MySQL 插入方法的性能比較”的內容了,經過本文的學習后,相信大家對大數據量的情況下 MySQL 插入方法的性能比較這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!

正文完
 
丸趣
版權聲明:本站原創(chuàng)文章,由 丸趣 2023-07-28發(fā)表,共計2840字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發(fā)布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 呈贡县| 庆阳市| 辉县市| 左权县| 恭城| 仙游县| 淄博市| 南澳县| 萝北县| 潞城市| 吴忠市| 光泽县| 安阳市| 青海省| 东港市| 绵阳市| 读书| 瑞昌市| 惠水县| 双鸭山市| 陆川县| 正镶白旗| 嵩明县| 原平市| 灌南县| 金山区| 康平县| 盐池县| 隆子县| 开阳县| 娄底市| 泸水县| 惠东县| 江油市| 兴化市| 壤塘县| 江陵县| 南和县| 襄樊市| 哈密市| 普兰店市|