1000W 数据插入到数据库要多久

李永波 发布于 2012/07/29 13:33
阅读 9K+
收藏 7

看了 社区的大牛们都在说 千万级别的数据  在各个数据库中的 速度和性能 心里痒痒的 

自己没有做过你那么大的项目 最多的纪录才 300万 实在是说不上话

想想何不自己试一试 插入 1千万的数据 具体测试一下看看 性能怎么样呢

于是
 mysql  5.5   pgsql 9.1   sqlserver 2005 进行了一次尝试 本来是想测试一下他们哦 查询速度 和修改表结构的速度 

但是插入 一千万的数据也是挺慢的 

于是就先说说 插入1000w 要多久吧

硬件  E5300  双核 2.6     内存 4G

系统 2003 sp2  32位

 

插入1000w 的数据 使用的是 C#  写的一个for 循环 极其简单

一条一条的插入 

Pgsql 第一次使用 所以不会优化性能

mysql 安装的时候选择 标准安装 没有做性能优化

sql2008  默认安装 

mysql 和 PGsql  sqlserver 2008 都是用这个程序插入的 

因没有统计 具体时间 所以呢就  同时运行 3 个程序 然后截图  从图中看数据
             截图1                   截图2             相同时间内插入条数

mysql     5471903              5477641           5738 

Sql2008   192383              193289              906 

PGsql       21665                23759               2094  

这里说明一下  PGsql 截图的时候 已经有 1000W的数据了

看这个数据 mysql 插入的数据大概是  PGsql 的3倍  sql2008 的6 倍  

不知道为什么 sql2008 这么慢 

------------------------

mysql 插入 1000w 条数据的时间大概是1个多小时  
PGsql 插入 1000W的时间大概是 4 个小时 上午9点左右开始 到 下午12:42 
SQL2008 实在是没法测试完 就用了mysql 的数据使用导入向导导入的 大概20 分钟 

因为刚开始的时候没有想统计这个 所以时间 不精确了

-------------------------

1000W 的count  mysql 很快                    sql2008 其次         PGsql 最慢
1000W 的alter  mysql 很慢 10分钟左右   sql2008 很快         PGsql 156毫秒  
-----------------------------------------------------------------------------------------

表结构 

 ID  自增

Content  50 字符串 

表内容
-----------------------------

ID  数字 
content  插入的时间

-----------------

 

 

 

 

加载中
0
mark35
mark35

引用来自“李永波”的答案

引用来自“宏哥”的答案

给楼主一点点提示:

且不说索引啥的,或者关闭fsync等.

楼主只要增加一个 负荷进程,持续查询 select count(*) 在数据插入表.

就知道什么叫做真正的数据库了.

我可以告诉你,你24小时之内都无法完成在mysql上的数据操作.

如果仅仅是插入 , bash 最快, echo "hello\n" >> test.txt. 1000万行,绝对比任何数据库都快.

pgsql
关闭 fsync 性能上有很大的提升 

1000W 每次 1000 条 同时 进行 select  count(*) 电脑偶尔有点小卡  耗时  不过 count 线程在  3729000 的时候就不跟着更新了  5201000(这个数字不错 适合跟媳妇说 O(∩_∩)O ) 的时候不动了  肯定是太慢了响应不过来了  总共耗时  581421.875 ms  

 

pgsql关闭 fsync性能有非常大提升。官方帮助文档说有25%提升,我测试是几倍。
1
宏哥
宏哥

引用来自“艺术家”的答案

其实大型应用,一般不会只有一个库,至少两个,一个读库,一个写库,所以在mysql中就会规避这个问题,在oracle中查询应该不会影响插入太多的性能,具体原理请 @宏哥 解释一下

数据库,不管是 oracle还是其他,都有数据版本管理. 所谓的查询,给出的结果是查询时间 的数据快照的结果,并不会block 数据插入. 由于有独立进程专门负责 写, 查询对写入的影响,只是减低了磁盘的速度.

mysql 不支持并发, 读写会互相block. "读写"分离就是为mysql 这种非数据库量身定做.

乌龟壳
乌龟壳
读多写少的环境,无论什么数据库,就算直接用文件系统管理数据,也要读写分离吧?
1
乌龟壳
乌龟壳

分享一个玩法,确实是用来玩的

create table a(f1 int, f2 text);

insert into a values(1, 'asdf')

然后手动重复执行: insert into a select * from a

很快就能到千万级了,以前测试数据库性能的时候这样做过。

ps:

postgres使用无日志的表,插入性能会有很大提升,只是牺牲了意外情况的完整性。

例如create unlogged table a ....

0
李永波
李永波
select min(content) , max(content) from qw 
在mysql 下执行时间 1 row in set (21.16 sec)

 在PGsql 下执行时间                (521796ms) 

 

0
l
laosong
把代码贴上来吧,还有你在windows下跑mysql和pg吗?
李永波
李永波
是在 windows 下跑的 你说的是什么代码 ?插入代码?就是一个for 循环而已
0
leo108
leo108
嗯,一切用数据说话
0
mark35
mark35
表存在索引么?
李永波
李永波
ID 是主键 有索引
0
猫哥-u
猫哥-u
你是批量提交吗,这么慢的速度
李永波
李永波
不是批量
0
猫哥-u
猫哥-u
我的测试 java + oracle, 采用BatchInsert的方式,每秒10W的插入速度,1000W 2分钟不到插入完成。
0
Arrowing
Arrowing
mysql导入文件,速度杠杠的。。。
返回顶部
顶部