億級別---資料生成及高效率匯入
阿新 • • 發佈:2019-01-07
引言
做這件事情之前,首先
對於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<span style="font-family: Arial, Helvetica, sans-serif; color: rgb(169, 183, 198);">;</span> CREATE INDEX did_index ON device (deviceID) USING BTREE;
相比於預設的INNODB引擎,MYISAM(非關係型儲存)對於批量資料插入效率較高
實際中,用python指令碼生成的資料檔案(txt) 大小為10GB左右,索引大小為1.7G左右。
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秒左右。
個人感覺,所謂的資料的插入和查詢,相比較而言只不過是空間和時間的相互轉化利用。