億級別 資料生成及高效率匯入

2021-07-16 12:24:17 字數 1820 閱讀 8446

引言

做這件事情之前,首先

對於mysql,首先需要改改mysql的預設儲存路徑,以免因為硬碟分割槽或者掛載容量的問題,導致資料插入不成功。

兩個解決方案:

對於mongodb,只需要改一下啟動時命令列的儲存路徑。

mysql

1. 建表 (僅列舉三個字段, 實際當中為20+ 字段)

create table device (

id int not null auto_increment,

deviceid char(16),

createdate timestamp default current_timestamp,

primary key(id)

) engine=myisam default charset=utf8;

create index did_index on device (deviceid) using btree;

相比於預設的innodb引擎,myisam(非關係型儲存)對於批量資料插入效率較高

2. 生成資料的標準格式參照 ---  (tab分隔字段)

實際中,用python指令碼生成的資料檔案(txt) 大小為10gb左右,索引大小為1.7g左右。

3. 將txt檔案匯入mysql --- ,耗時20--30分鐘。 生成資料庫大小為12gb -- 13 gb

mysql> load data local infile '/path/device.txt' into table device;

4. 按索引進行查詢(非索引覆蓋),普通硬碟的訪問時間5秒,ssd在0.3--0.5秒,由此看出,瓶頸在硬碟讀寫。

mongodb

參考資料:

1. mongodb啟動時,關閉journal。

$ mongod --nojounal --dbpath /sandbox/mongo_data --port 27018

2. 訪問mongodb

$ mongo localhost:27018/test1

3. 匯入資料 (可以去官網查詢import的具體引數細節)

$ mongoimport --db test1 --host localhost --port 27018 --collection device --drop --type tsv --headerline --file /sandbox/device_tsv.tsv --numinsertionworkers 8
note: 為了提高mongodb的插入效率,我們可以採用mongodb推薦的(numinsertionworkers)多執行緒操作。本質來說,就是將insert任務,拆分成多個執行緒來做。

a. mongodb 匯入資料檔案格式不支援txt, 但是支援tsv --- 資料記錄用tab分隔的檔案格式

b. 指令碼生成的資料大小為10gb -- 11gb (device_tsv.tsv)

c. 在匯入資料前,不生成索引。在資料批量插入以後生成,可以大大提高插入效率。

d. 實際匯入資料庫後,發現指定目錄的資料儲存為218gb。 匯入時間不足一小時。

e. 但是查詢效率表現不俗,在普通硬碟上按索引查詢,在0.5秒左右。

個人感覺,所謂的資料的插入和查詢,相比較而言只不過是空間和時間的相互轉化利用。

PHP 千萬級別資料插入

header content type text html charset utf 8 設定 執行不受時間限制 set time limit 0 鏈結資料庫 con mysqli connect 127.0.0.1 root test if mysqli connect error 設定編碼為utf...

Mysql千萬級別資料優化方案

一 目的與意義 1 說明 在mysql單錶中資料達到千萬級別時資料的分頁查詢結果時間過長,對此進行優達到最優效果,也就是時間最短 此統計利用的jdbc連線,其中fid為該錶的主鍵 二 解決思路與根據 本測試表中資料在千萬級別 1 建立索引 優點 當表中有大量記錄時,若要對錶進行查詢,第一種搜尋資訊方...

千萬級別資料插入實現方案

上次面試問我上萬級別的資料如何快速插入資料庫,當時不知怎麼回答,回來通過查資料和實踐,通過執行緒池和事務管理實現了批量快速插入資料,特地總結一下。目錄結構,乙個簡單的springboot工程 首先建立乙個普通的表只有三個字段 create database if not exists demo us...