怎么能快速的遍历整个mysql表?

fancyerii
fancyerii 2014-08-26 字数 444

有一个一百多万行的表,没有整数id,pk是url。现在想快速的扫整个表,现在用的方法是:

Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);

stmt.setFetchSize(Integer.MIN_VALUE);

ResultSet rs=stmt.executeQuery("select * from table");

while(rs.next()){

}

目前的速度大概是100行/sec,这搞完得要三四个小时。

有没有更快的办法?比如把表dump成csv会不会快?

Java Java技术
31 个回复
kobe2000
kobe2000 2014-08-26

用的方法能加速吗?

【 在 fancyerii (高知太浮躁,少来少烦恼) 的大作中提到: 】

: 有一个一百多万行的表,没有整数id,pk是url。现在想快速的扫整个表,现在用的方法是:

:       Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);

:       stmt.setFetchSize(Integer.MIN_VALUE);

: ...................

fancyerii
fancyerii 2014-08-26

什么方法?

我现在这个只是不一次性把结果放到内存而已,否则早爆了。

http://dev.mysql.com/doc/connector-j/en/connector-j-reference-implementation-notes.html

我是问还有没有更快的方法。

【 在 kobe2000 的大作中提到: 】

: 用的方法能加速吗?

kobe2000
kobe2000 2014-08-26

哪年头的驱动了?换最新的

【 在 fancyerii (高知太浮躁,少来少烦恼) 的大作中提到: 】

: 什么方法?

: 我现在这个只是不一次性把结果放到内存而已,否则早爆了。

http://dev.mysql.com/doc/connector-j/en/connector-j-reference-implementation-notes.html

: ...................

fancyerii
fancyerii 2014-08-26

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.31</version>

</dependency>

【 在 kobe2000 的大作中提到: 】

: 哪年头的驱动了?换最新的

fancyerii
fancyerii 2014-08-26

补充:某个字段是网页的html,可能有几十上百K。

【 在 fancyerii 的大作中提到: 】

: 有一个一百多万行的表,没有整数id,pk是url。现在想快速的扫整个表,现在用的方法是:

:       Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);

:       stmt.setFetchSize(Integer.MIN_VALUE);

: ...................

kobe2000
kobe2000 2014-08-26

那也会爆内存?

【 在 fancyerii (高知太浮躁,少来少烦恼) 的大作中提到: 】

:         <dependency>

:             <groupId>mysql</groupId>

:             <artifactId>mysql-connector-java</artifactId>

: ...................

wew
吴钩霜雪明 2014-08-26

dump成文本然后解析?

【 在 nullgate (空门·忽然而已) 的大作中提到: 】

: dump 出来处理

fancyerii
fancyerii 2014-08-26

dump什么格式?html里什么乱七八糟的字符都有,会不会有问题?

【 在 nullgate 的大作中提到: 】

: dump 出来处理

fancyerii
fancyerii 2014-08-26

就是担心dump的csv不对,然后调试半天,3小时还没搞定。

【 在 nullgate 的大作中提到: 】

: mysql 能处理程序还不能处理么...

wew
吴钩霜雪明 2014-08-26

我在想如果弄成bin格式是否会更快

【 在 nullgate (空门·忽然而已) 的大作中提到: 】

: 经常用 perl 处理千万行 json 的飘过

canper
洗衣粉 2014-08-26

三个小时算毛

【 在 fancyerii 的大作中提到: 】

: 就是担心dump的csv不对,然后调试半天,3小时还没搞定。

: 【 在 nullgate 的大作中提到: 】

: : mysql 能处理程序还不能处理么...

: ....................

muser
负尽千重罪,练就不死心 2014-08-26

这一贴,从头到尾你都在担心~~~

【 在 fancyerii 的大作中提到: 】

: 就是担心dump的csv不对,然后调试半天,3小时还没搞定。

ssd
ssd 2014-08-26

一次读1000行,一边读一边处理

sql用上lmt和offset分页

【 在 fancyerii (高知太浮躁,少来少烦恼) 的大作中提到: 】

: 有一个一百多万行的表,没有整数id,pk是url。现在想快速的扫整个表,现在用的方法是:

:       Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);

:       stmt.setFetchSize(Integer.MIN_VALUE);

: ...................

CNMAN
环顾四方有效-巨型菜鸟 2014-08-26

查询可以不要大字段?

【 在 fancyerii (高知太浮躁,少来少烦恼) 的大作中提到: 】

: 有一个一百多万行的表,没有整数id,pk是url。现在想快速的扫整个表,现在用的方法是:

:       Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);

:       stmt.setFetchSize(Integer.MIN_VALUE);

: ...................

CNMAN
环顾四方有效-巨型菜鸟 2014-08-26

多线程同时,理论上会快些

比如一个线程读10000条

他这个得加个序号字段

【 在 ssd (ssd) 的大作中提到: 】

: 一次读1000行,一边读一边处理

: sql用上lmt和offset分页

fancyerii
fancyerii 2014-08-26

没整数id,pk是string(varchar)

【 在 ssd 的大作中提到: 】

: 一次读1000行,一边读一边处理

: sql用上lmt和offset分页

smartgear
smartgear 2014-08-26

难道没有整数id就不能分页吗?

【 在 fancyerii (高知太浮躁,少来少烦恼) 的大作中提到: 】

: 没整数id,pk是string(varchar)

fancyerii
fancyerii 2014-08-26

分页怎么实现的?你可以随机产生一百万数据试试翻到最后一页多久

【 在 smartgear 的大作中提到: 】

: 难道没有整数id就不能分页吗?

smartgear
smartgear 2014-08-26

100w数据翻到最后一页也许速度不快。

不过,在int主键上的分页难道就速度飞快?

和varchar主键的分页差别在哪里呢?

你的主键有多长。

把主键全部取出来,排序,然后划分区间,分派到不同进程并发处理,是否可行?

【 在 fancyerii (高知太浮躁,少来少烦恼) 的大作中提到: 】

: 分页怎么实现的?你可以随机产生一百万数据试试翻到最后一页多久