亿级别---数据生成及高效率导入

引言

做这件事情之前,首先

1. 对于MySQL,首先需要改改mysql的默认存储路径,以免因为硬盘分区或者挂载容量的问题,导致数据插入不成功。

两个解决方案:

http://dba.stackexchange.com/questions/24403/change-existing-datadir-path

http://stackoverflow.com/questions/1795176/how-to-change-mysql-data-directory

 

2. 对于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. 生成数据的标准格式参照 --- https://dev.mysql.com/doc/refman/5.5/en/loading-tables.html  (tab分隔字段)

    实际中,用Python脚本生成的数据文件(txt) 大小为10GB左右,索引大小为1.7G左右。

3. 将txt文件导入mysql --- https://dev.mysql.com/doc/refman/5.5/en/loading-tables.html,耗时20--30分钟。 生成数据库大小为12GB -- 13 GB

mysql> LOAD DATA LOCAL INFILE '/path/device.txt' INTO TABLE device;

4. 按索引进行查询(非索引覆盖),普通硬盘的访问时间5秒,SSD在0.3--0.5秒,由此看出,瓶颈在硬盘读写。

 

MONGODB

参考资料:https://www.khalidalnajjar.com/insert-200-million-rows-into-mongodb-in-minutes/

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秒左右。

 

个人感觉,所谓的数据的插入和查询,相比较而言只不过是空间和时间的相互转化利用。

 

你可能感兴趣的:(数据库)