引言
做這件事情之前,首先
對於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...