对测试数据的分析
SQL数据库与Lucene数据库性能测试报告
一、 测试目的
本测试试图对用相同数据制作的SQL数据库与Lucene数据库对语义相同的查询语句的性能作一个简单的比较与分析,以找出各自的优缺点,并讨论其各自的适用场合。
二、 测试环境
CPU:AMD Atholon64 3200+,2.0G
内存:896MB
OS:Windows 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个字段,各字段名称及类型描述如下:

其中,本测试选取了ID、senderName、msgBody、msgTo四列来测试。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
|