<MongoDB | Mysql>亿级别---数据生成及高效率导入
2016-08-11 14:51
477 查看
引言
做这件事情之前,首先
对于mysql,首先需要改改mysql的默认存储路径,以免因为硬盘分区或者挂载容量的问题,导致数据插入不成功。
两个解决方案:
http://dba.stackexchange.com/questions/24403/change-existing-datadir-path
http://stackoverflow.com/questions/1795176/how-to-change-mysql-data-directory
对于mongodb,只需要改一下启动时命令行的存储路径。
MYSQL
1. 建表 (仅列举三个字段, 实际当中为20+ 字段)
相比于默认的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
3. 导入数据 (可以去官网查询import的具体参数细节)
note: 为了提高mongodb的插入效率,我们可以采用mongodb推荐的(numInsertionWorkers)多线程操作。本质来说,就是将insert任务,拆分成多个线程来做。
a. mongodb 导入数据文件格式不支持txt, 但是支持tsv --- 数据记录用tab分隔的文件格式
b. 脚本生成的数据大小为10GB -- 11GB (device_tsv.tsv)
c. 在导入数据前,不生成索引。在数据批量插入以后生成,可以大大提高插入效率。
d. 实际导入数据库后,发现指定目录的数据存储为218GB。 导入时间不足一小时。
e. 但是查询效率表现不俗,在普通硬盘上按索引查询,在0.5秒左右。
个人感觉,所谓的数据的插入和查询,相比较而言只不过是空间和时间的相互转化利用。
做这件事情之前,首先
对于mysql,首先需要改改mysql的默认存储路径,以免因为硬盘分区或者挂载容量的问题,导致数据插入不成功。
两个解决方案:
http://dba.stackexchange.com/questions/24403/change-existing-datadir-path
http://stackoverflow.com/questions/1795176/how-to-change-mysql-data-directory
对于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(非关系型存储)对于批量数据插入效率较高
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秒左右。
个人感觉,所谓的数据的插入和查询,相比较而言只不过是空间和时间的相互转化利用。
相关文章推荐
- <java> <JTable> 关于设置JTable导入数据后自动排序-小记
- mysql导入导出sql文件 window下 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u dbuser -p dbname >
- mongodb导出数据导入mysql
- 将mongodb 数据指定字段导出,然后指定字段导入mysql 实例 及相关问题解决
- mongodb mysql数据互相导入
- 从百万级别数据的分析角度,Mysql,Mongodb,Hbase如何选择?
- <shell> mongodb查看某个字段的数据类型
- 从mysql导入数据到mongodb
- 用php导入10W条+ 级别的csv大文件数据到mysql。导出10W+级别数据到csv文件
- 导入excel表格的数据--->到mysql中
- 用php导入10W条+ 级别的csv大文件数据到mysql。导出10W+级别数据到csv文件
- windows :TPC-H测试的数据库模式生成及其数据导入MySQL的教程记录
- Jpa生成mysql注释,添加ODBC数据源导入数据到EA
- 从mysql导入数据到mongodb的方法
- sqlserver数据导入mysql三: 把生成的表分成几份(拆分成几份运行)
- 百万级别数据,数据库Mysql,Mongodb,Hbase如何选择?
- 将mysql数据导入mongodb
- sqlserver数据导入mysql三: 把生成的表分成几份(拆分成几份运行)
- <Power Shell>05解决powershell3.0收集数据时候数组生成
- 从百万级别数据的分析角度,Mysql,Mongodb,Hbase如何选择?