postgresql批量插入性能问题(关于mysql)

Erd*_*kın 2 mysql postgresql performance bulkinsert

我有很多数据,我想至少时间插入数据库.我做了一些测试.我用21列创建了一个表(使用下面的脚本*1).1列是int,其他20列是string.没有索引.我编写了一个测试代码,创建一个随机值并插入到DB中(使用insert sql*2).在运行sql命令之前,调用conn.setAutoCommit(false)而不是conn.commit().此操作约6-7秒.有官方文件(*3)表示使用"COPY"命令进行批量插入.创建类似的ascii文件并重新测试,此测试完成约5秒.在同一台机器上使用相同的测试代码,将相同的数据插入Mysql,测试时间不到1秒.我真的很惊讶,6-7秒的性能提升很大.这有什么不同确实存在或我忽略了什么.

谢谢你的帮助

我的测试配置是solaris 10和PostgreSQL 9.0.2以及Mysql 5.0.85.

(*1)PostgreSQL创建数据库脚本

CREATE TABLE tablo
(
  id integer,
  column1 character varying(50),
  column2 character varying(50),
  column3 character varying(50),
  ....
  column20 character varying(50)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE tablo OWNER TO pgadmin;
Run Code Online (Sandbox Code Playgroud)

(*2)插入查询

INSERT INTO tablo values (1,'column67062724628797','column26007603757271','column73982294239806','column43213154421324','column97722282440805','column79000889379973','column10680880337755','column14322827996050','column80720842739399','column22777514445036','column77771307997926','column92799724462613','column89992937353110','column61693061355353','column43804223262229','column62209656630047','column52150955786400','column85726157993572','column33358888005133','column77743799989746'),(2,'column77383691774831','column67841193885377','column36149612452454','column51161680852595','column91649734476301','column57283307765550','column14997046117948','column29457857794726','column91157683305554','column44413196495111','column40702778794938','column24744999726868','column38356057278249','column16808618337554','column64362413535503','column19577167594144','column72943639162993','column46830376244427','column01942608599939','column66479131355003'),
....
10K lines
Run Code Online (Sandbox Code Playgroud)

(*3)官方PostgreSql文档地址 http://www.postgresql.org/docs/8.3/interactive/populate.html

ara*_*nid 5

似乎很奇怪你没有看到像使用COPY这样的加速.我生成了一个脚本来创建一个类似的表并用10,000行填充它,并发现:

  1. 最慢:每次插入1行,没有事务块,fsync = on
  2. 更快:在事务中包装所有语句(创建表,插入....)
  3. 速度与2相同:为1,但转fsync = off
  4. 最快:使用pg_dump创建的脚本进行恢复,以使用COPY填充表格

方法2和方法3比方法1快4倍.方法4比2或3快约10倍.

如果我在我的机器上将相同的数据导入到mysql中,则需要大约一半的时间作为方法2或3.倾倒并重新加载它,相同.用-e转储并重新加载,同样.使用InnoDB将时间推迟到与方法2或3相同.

所以至少在我的硬件/操作系统组合中,两者之间的速度是可比较的......虽然我当然更好地照顾postgresql的设置,但对于像这样的小桌子,我不希望像缓冲区缓存大小这样的事情很重要?

现在,关于批量插入的JDBC支持有多好,我不知道.我只使用命令行客户端做了所有这些事情.