posts - 267,  comments - 1129,  trackbacks - 0
对测试数据的分析

SQL数据库与Lucene数据库性能测试报告

一、       测试目的

本测试试图对用相同数据制作的SQL数据库与Lucene数据库对语义相同的查询语句的性能作一个简单的比较与分析,以找出各自的优缺点,并讨论其各自的适用场合。

 

二、       测试环境

       CPUAMD Atholon64 3200+2.0G

       内存:896MB

       OSWindows 2003

       Jre版本:1.6.0_01

       Jdk版本:1.5.0_06

       Lucene版本:2.2.0

       JDBC版本:Microsoft SQL Server 2005JDBC Driver 1.2

 

三、       测试数据设计

本次测试采用的数据来自校讯通的真实运营数据,原始数据是SQL数据库的一张数据表,该表共有33个字段,各字段名称及类型描述如下:

 

其中,本测试选取了IDsenderNamemsgBodymsgTo四列来测试。ID代表了已做索引的int型字段;senderName代表varchar型的短文本字段;msgBody代表nvarchar型长文本字段;msgTo代表保存为varchar型的数值字段。

原始数据共有5623689组,占用约2GB的硬盘空间。在本测试中,分别选取其中前100万组数据和前491万组数据来参与测试。相同数据量的Lucene索引使用自写的RDB2Lucene Java包生成。对所有的列都进行了索引化和词元化。

设计测试数据时,考虑到以下几个方面的对比:

ü        不同字段的查询的对比;

ü        不同结果集规模的对比;

ü        不同查询数据规模的对比;

ü        同一项测试连续进行多次的前后效率对比

 

具体测试数据及测试结果见以下两个统计表:

100万组数据测试统计表:

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
 

 

 
 

 

 
 

SQL

 
 

Lucene

 
 

 

 
 

用例

 
 

搜索字段

 
 

搜索词

 
 

结果集

 
 

用时

 
 

搜索词

 
 

结果集

 
 

用时

 
 

结果集

 
 

1

 
 

ID

 
 

%1%

 
 

491542

 
 

10906

 
 

 

 
 

 

 
 

 

 
 

不同

 
 

2

 
 

ID

 
 

1%

 
 

153660

 
 

1250

 
 

1*

 
 

153660

 
 

24502

 
 

相同

 
 

3

 
 

ID

 
 

1234

 
 

1

 
 

1453

 
 

1234

 
 

1

 
 

2047

 
 

相同

 
 

4

 
 

ID

 
 

2%

 
 

110981

 
 

1109

 
 

2*

 
 

110981

 
 

16845

 
 

相同

 
 

5

 
 

ID

 
 

3%

 
 

108023

 
 

1094

 
 

3*

 
 

108023

 
 

3672

 
 

相同

 
 

6

 
 

ID

 
 

111_

 
 

10

 
 

1437

 
 

111?

 
 

10

 
 

63

 
 

相同

 
 

7

 
 

ID

 
 

1%2%

 
 

66133

 
 

1578

 
 

1*2*

 
 

66133

 
 

1907

 
 

相同

 
 

8

 
 

ID

 
 

7%8%

 
 

44493

 
 

1531

 
 

7*8*

 
 

44493

 
 

2750

 
 

相同

 
 

9

 
 

ID

 
 

4_5_

 
 

100

 
 

1406

 
 

4?5?

 
 

100

 
 

735

 
 

相同

 
 

10

 
 

senderName

 
 

%

 
 

4753

 
 

1235

 
 

 

 
 

 

 
 

 

 
 

不同

 
 

11

 
 

senderName

 
 

%%

 
 

9124

 
 

1141

 
 

 
 

9124

 
 

281

 
 

相同

 
 

12

 
 

senderName

 
 

%林雨%

 
 

6

 
 

1141

 
 

林雨

 
 

6

 
 

78

 
 

相同

 
 

13

 
 

senderName

 
 

%家长%'

 
 

103

 
 

1141

 
 

家长

 
 

103

 
 

32

 
 

相同

 
 

14

 
 

msgBody

 
 

%%'

 
 

17579

 
 

14767

 
 

 
 

17579

 
 

219

 
 

相同

 
 

15

 
 

msgBody

 
 

%林雨%

 
 

46

 
 

14595

 
 

林雨

 
 

46

 
 

78

 
 

相同

 
 

16

 
 

msgBody

 
 

%家长%

 
 

532790

 
 

10798

 
 

家长

 
 

532790

 
 

3406

 
 

相同

 
 

17

 
 

msgBody

 
 

%家长%

 
 

532790

 
 

10501

 
 

家长

 
 

532790

 
 

375

 
 

相同

 
 

18

 
 

msgBody

 
 

'%小学%

 
 

61657

 
 

14861

 
 

小学

 
 

61679

 
 

890

 
 

不同

 
 

19

 
 

msgBody

 
 

%%

 
 

132968

 
 

14439

 
 

*

 
 

132968

 
 

32

 
 

相同

 
 

20

 
 

msgBody

 
 

%%

 
 

3666

 
 

1359

 
 

**

 
 

0

 
 

16

 
 

不同

 
 

21

 
 

msgBody

 
 

%你的孩子已于%

 
 

680

 
 

14876

 
 

你的孩子已于

 
 

680

 
 

2828

 
 

相同

 
 

22

 
 

msgBody

 
 

%%

 
 

50014

 
 

15032

 
 

 

 
 

 

 
 

 

 
 

不同

 
 

23

 
 

msgTo

 
 

%1%

 
 

999949

 
 

2906

 
 

1*

 
 

999943

 
 

19609

 
 

不同

 
 

24

 
 

msgTo

 
 

%1%

 
 

999949

 
 

2454

 
 

1*

 
 

999943

 
 

45750

 
 

不同

 
 

25

 
 

msgTo

 
 

'%1%

 
 

999949

 
 

2375

 
 

1*

 
 

999943

 
 

5969

 
 

不同

 
 

26

 
 

msgTo

 
 

%13%

 
 

998059

 
 

2547

 
 

 

 
 

 

 
 

 

 
 

不同

 
 

27

 
 

msgTo

 
 

13%

 
 

997901

 
 

2110

 
 

13*

 
 

997926

 
 

6203

 
 

不同

 
 

28

 
 

msgTo

 
 

1392.22

 
 

3371

 
 

921

 
 

139222*

 
 

3371

 
 

15

 
 

相同

 
 

29

 
 

msgTo

 
 

139222%9

 
 

345

 
 

1750

 
 

139222*9

 
 

345

 
 

78

 
 

相同

 
 

30

 
 

msgTo

 
 

13912345678

 
 

74

 
 

1672

 
 

13912345678

 
 

74

 
 

171

 
 

相同

 
 

31

 
 

msgTo

 
 

1_9_2_0_0_9

 
 

95

 
 

1766

 
 

1?9?2?0?0?9

 
 

95

 
 

125

 
 

相同

 
 

32

 
 

msgTo

 
 

'1%9%2%0%0%9

 
 

710

 
 

3891

 
 

1*9*2*0*0*9

 
 

710

 
 

219

 
 

相同

 

 

 

四、       对测试数据的分析

可以从两个方向来分析这两个数据表

Ø        纵向比较

通过对比不同测试数据的用时,我们发现以下规律:

1)  SQL数据库的搜索用时与被搜索字段密切相关,返回结果集的大小对搜索用时的影响相对较小,对大数据量字段的查询会造成性能急剧下降。

在数据量为100万条记录的统计表中,对ID列的查询时间基本为1.2~1.4秒(例外是数据1);对senderName列的查询时间基本为1.1~1.2秒;对msgBody列的查询时间基本为14秒(例外是数据20),对msgTo的查询时间基本为1.7~2.4

在数据量为491万条记录的统计表中,对ID列的查询时间基本为4.5~6秒;对senderName列的查询时间基本为50秒;对msgBody列的查询时间基本为70~80秒,对msgTo的查询时间基本为47~50秒(例外是数据35

2)  Lucene索引的搜索用时与返回结果集的大小密切相关,而与被查询列关系不大。

100万数据表按不同查询列进行染色,再按返回结果集的大小进行排序,或先按查询列排序,再按结果集排序,便得到以下两表(连续的同项测试只保留第一项):

                                                                                                                                                                                                                                                                                                 
 

数据

 
 

搜索字段

 
 

结果集

 
 

用时

 
 

20

 
 

msgBody

 
 

0

 
 

16

 
 

3

 
 

ID

 
 

1

 
 

2047

 
 

12

 
 

senderName

 
 

6

 
 

78

 
 

6

 
 

ID

 
 

10

 
 

63

 
 

15

 
 

msgBody

 
 

46

 
 

78

 
 

30

 
 

msgTo

 
 

74

 
 

171

 
 

31

 
 

msgTo

 
 

95

 
 

125

 
 

9

 
 

ID

 
 

100

 
 

735

 
 

13

 
 

senderName

 
 

103

 
 

32

 
 

29

 
 

msgTo

 
 

345

 
 

78

 
 

21

 
 

msgBody

 
 

680

 
 

2828

 
 

32

 
 

msgTo

 
 

710

 
 

219

 
 

28

 
 

msgTo

 
 

3371

 
 

15

 
 

11

 
 

senderName

 
 

9124

 
 

281

 
 

14

 
 

msgBody

 
 

17579

 
 

219

 
 

8

 
 

ID

 
 

44493

 
 

2750

 
 

18

 
 

msgBody

 
 

61679

 
 

890

 
 

7

 
 

ID

 
 

66133

 
 

1907

 
 

5

 
 

ID

 
 

108023

 
 

3672

 
 

4

 
 

ID

 
 

110981

 
 

16845

 
 

19

 
 

msgBody

 
 

132968

 
 

32

 
 

2

 
 

ID

 
 

153660

 
 

24502

 
 

16

 
 

msgBody

 
 

532790

 
 

3406