【轉】SQL數據庫與Lucene數據庫性能測試報告

SQL數據庫與Lucene數據庫性能測試報告

<spanlang=en-us style="font-size: 14pt;">一、       測試目的

<spanstyle='font-family:宋體'>本測試試圖對用相同數據製作的SQL<spanstyle='font-family:宋體'>數據庫與Lucene<spanstyle='font-family:宋體'>數據庫對語義相同的查詢語句的性能作一個簡單的比較與分析,以找出各自的優缺點,並討論其各自的適用場合。

<spanlang=en-us> 

<spanlang=en-us style="font-size: 14pt;">二、       測試環境

       CPU<spanstyle='font-family:宋體'>:AMD Atholon64 3200+<spanstyle='font-family:宋體'>,<span lang=en-us>2.0G

       <spanstyle='font-family:宋體'>內存:896MB

       OS<spanstyle='font-family:宋體'>:Windows 2003

       Jre<spanstyle='font-family:宋體'>版本:<span lang=en-us>1.6.0_01

       Jdk<spanstyle='font-family:宋體'>版本:<span lang=en-us>1.5.0_06

       Lucene<spanstyle='font-family:宋體'>版本:<span lang=en-us>2.2.0

       JDBC<spanstyle='font-family:宋體'>版本:Microsoft SQL Server 2005JDBC Driver 1.2

 

<spanlang=en-us style="font-size: 14pt;">三、       測試數據設計

本次測試採用的數據來自校訊通的真實運營數據,原始數據是<spanlang=en-us>SQL數據庫的一張數據表,該表共有<spanlang=en-us>33個字段,各字段名稱及類型描述如下:

 

其中,本測試選取了<spanlang=en-us>IDsenderName<spanstyle='font-family:宋體'>、msgBody<spanstyle='font-family:宋體'>、msgTo<spanstyle='font-family:宋體'>四列來測試。ID<spanstyle='font-family:宋體'>代表了已做索引的int<spanstyle='font-family:宋體'>型字段;senderName<spanstyle='font-family:宋體'>代表varchar<spanstyle='font-family:宋體'>型的短文本字段;msgBody<spanstyle='font-family:宋體'>代表nvarchar<spanstyle='font-family:宋體'>型長文本字段;msgTo<spanstyle='font-family:宋體'>代表保存爲varchar<spanstyle='font-family:宋體'>型的數值字段。

原始數據共有<spanlang=en-us>5623689組,佔用約<spanlang=en-us>2GB的硬盤空間。在本測試中,分別選取其中前<spanlang=en-us>100萬組數據和前<spanlang=en-us>491萬組數據來參與測試。相同數據量的<spanlang=en-us>Lucene索引使用自寫的<spanlang=en-us>RDB2Lucene Java包生成。對所有的列都進行了索引化和詞元化。

設計測試數據時,考慮到以下幾個方面的對比:

<spanlang=en-us style="font-family: Wingdings;">ü        不同字段的查詢的對比;

<spanlang=en-us style="font-family: Wingdings;">ü        不同結果集規模的對比;

<spanlang=en-us style="font-family: Wingdings;">ü        不同查詢數據規模的對比;

<spanlang=en-us style="font-family: Wingdings;">ü        同一項測試連續進行多次的前後效率對比

 

具體測試數據及測試結果見以下兩個統計表:

100<spanstyle='font-family:宋體'>萬組數據測試統計表:

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
 

 

 
 

 

 
 

SQL

 
 

Lucene

 
 

 

 
 

<span  style="font-family: 宋體;">用例

 
 

搜索字段

 
 

搜索詞

 
 

結果集

 
 

用時

 
 

搜索詞

 
 

結果集

 
 

用時

 
 

結果集

 
 

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

 
 

%<span  style="font-family: 宋體;">林%

 
 

9124

 
 

1141

 
 

 
 

9124

 
 

281

 
 

相同

 
 

12

 
 

senderName

 
 

%<span  style="font-family: 宋體;">林雨%

 
 

6

 
 

1141

 
 

林雨

 
 

6

 
 

78

 
 

相同

 
 

13

 
 

senderName

 
 

%<span  style="font-family: 宋體;">家長%'

 
 

103

 
 

1141

 
 

家長

 
 

103

 
 

32

 
 

相同

 
 

14

 
 

msgBody

 
 

%<span  style="font-family: 宋體;">林%'

 
 

17579

 
 

14767

 
 

 
 

17579

 
 

219

 
 

相同

 
 

15

 
 

msgBody

 
 

%<span  style="font-family: 宋體;">林雨%

 
 

46

 
 

14595

 
 

林雨

 
 

46

 
 

78

 
 

相同

 
 

16

 
 

msgBody

 
 

%<span  style="font-family: 宋體;">家長%

 
 

532790

 
 

10798

 
 

家長

 
 

532790

 
 

3406

 
 

相同

 
 

17

 
 

msgBody

 
 

%<span  style="font-family: 宋體;">家長%

 
 

532790

 
 

10501

 
 

家長

 
 

532790

 
 

375

 
 

相同

 
 

18

 
 

msgBody

 
 

'%<span  style="font-family: 宋體;">小學%

 
 

61657

 
 

14861

 
 

小學

 
 

61679

 
 

890

 
 

不同

 
 

19

 
 

msgBody

 
 

%<span  style="font-family: 宋體;">小%

 
 

132968

 
 

14439

 
 

*

 
 

132968

 
 

32

 
 

相同

 
 

20

 
 

msgBody

 
 

%<span  lang="EN-US">%

 
 

3666

 
 

1359

 
 

*<span  lang="EN-US">*

 
 

0

 
 

16

 
 

不同

 
 

21

 
 

msgBody

 
 

%<span  style="font-family: 宋體;">你的孩子已於%

 
 

680

 
 

14876

 
 

你的孩子已於

 
 

680

 
 

2828

 
 

相同

 
 

22

 
 

msgBody

 
 

%<span  style="font-family: 宋體;">小%

 
 

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

 
 

相同

 

 

 

<spanlang=en-us style="font-size: 14pt;">四、       對測試數據的分析

可以從兩個方向來分析這兩個數據表

<spanlang=en-us style="font-family: Wingdings;">Ø        縱向比較

通過對比不同測試數據的用時,我們發現以下規律:

<spanlang=en-us>1)  <spanlang=en-us>SQL數據庫的搜索用時與被搜索字段密切相關,返回結果集的大小對搜索用時的影響相對較小,對大數據量字段的查詢會造成性能急劇下降。

<spanstyle='font-family:宋體'>在數據量爲100<spanstyle='font-family:宋體'>萬條記錄的統計表中,對ID<spanstyle='font-family:宋體'>列的查詢時間基本爲1.2<spanstyle='font-family:宋體'>秒~1.4<spanstyle='font-family:宋體'>秒(例外是數據1<spanstyle='font-family:宋體'>);對senderName<spanstyle='font-family:宋體'>列的查詢時間基本爲1.1<spanstyle='font-family:宋體'>秒~1.2<spanstyle='font-family:宋體'>秒;對msgBody<spanstyle='font-family:宋體'>列的查詢時間基本爲14<spanstyle='font-family:宋體'>秒(例外是數據20<spanstyle='font-family:宋體'>),對msgTo<spanstyle='font-family:宋體'>的查詢時間基本爲1.7<spanstyle='font-family:宋體'>秒~2.4<spanstyle='font-family:宋體'>秒

<spanstyle='font-family:宋體'>在數據量爲491<spanstyle='font-family:宋體'>萬條記錄的統計表中,對ID<spanstyle='font-family:宋體'>列的查詢時間基本爲4.5<spanstyle='font-family:宋體'>秒~6<spanstyle='font-family:宋體'>秒;對senderName<spanstyle='font-family:宋體'>列的查詢時間基本爲50<spanstyle='font-family:宋體'>秒;對msgBody<spanstyle='font-family:宋體'>列的查詢時間基本爲70<spanstyle='font-family:宋體'>秒~80<spanstyle='font-family:宋體'>秒,對msgTo<spanstyle='font-family:宋體'>的查詢時間基本爲47<spanstyle='font-family:宋體'>秒~50<spanstyle='font-family:宋體'>秒(例外是數據35<spanstyle='font-family:宋體'>)

<spanlang=en-us>2)  <spanlang=en-us>Lucene索引的搜索用時與返回結果集的大小密切相關,而與被查詢列關係不大。

<spanlang=en-us>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

 
 

27

 
 

msgTo

 
 

997926

 
 

6203

 
 

23

 
 

msgTo

 
 

999943

 
 

19609

 
 

數據

 
 

搜索字段

 
 

結果集

 
 

用時

 
 

3

 
 

ID

 
 

1

 
 

2047

 
 

6

 
 

ID

 
 

10

 
 

63

 
 

9

 
 

ID

 
 

100

 
 

735

 
 

8

 
 

ID

 
 

44493

 
 

2750

 
 

7

 
 

ID

 
 

66133

 
 

1907

 
 

5

 
 

ID

 
 

108023

 
 

3672

 
 

4

 
 

ID

 
 

110981

 
 

16845

 
 

2

 
 

ID

 
 

153660

 
 

24502

 
 

20

 
 

msgBody

 
 

0

 
 

16

 
 

15

 
 

msgBody

 
 

46

 
 

78

 
 

21

 
 

msgBody

 
 

680

 
 

2828

 
 

14

 
 

msgBody

 
 

17579

 
 

219

 
 

18

 
 

msgBody

 
 

61679

 
 

890

 
 

19

 
 

msgBody

 
 

132968

 
 

32

 
 

16

 
 

msgBody

 
 

532790

 
 

3406

 
 

30

 
 

msgTo

 
 

74

 
 

171

 
 

31

 
 

msgTo

 
 

95

 
 

125

 
 

29

 
 

msgTo

 
 

345

 
 

78

 
 

32

 
 

msgTo

 
 

710

 
 

219

 
 

28

 
 

msgTo

 
 

3371

 
 

15

 
 

27

 
 

msgTo

 
 

997926

 
 

6203

 
 

23

 
 

msgTo

 
 

999943

 
 

19609

 
 

12

 
 

senderName

 
 

6

 
 

78

 
 

13

 
 

senderName

 
 

103

 
 

32

 
 

11

 
 

senderName

 
 

9124

 
 

281

 
         

<brclear=all style="page-break-before: auto;"><brclear=all style="page-break-before: auto;">

可見,搜索用時與結果集的大小密切相關,用時有明顯地隨結果集增大而增多(雖然不是絕對的)特別地,當結果集進一步加大時,搜索用時可能會急劇增加而使程序無法終止,這一點在<spanlang=en-us>491萬數據組的測試中非常常見。也就是說,當數據庫規模增長到<spanlang=en-us>490萬條記錄,<span lang=en-us>2G數據時,獲取全部結果集的做法已變得不太現實。

<spanlang=en-us>3)  <spanstyle='font-family:宋體'>當連續測試同一組數據時,SQL<spanstyle='font-family:宋體'>數據庫和Lucene<spanstyle='font-family:宋體'>數據庫的用時都會比第一次測試用時要少。相關的測試數據在100<spanstyle='font-family:宋體'>萬數據組是:

                                                                                                                                   
 

 

 
 

 

 
 

SQL

 
 

Lucene

 
 

<span  style="font-size: 12pt; font-family: 宋體;">用例

 
 

搜索字段

 
 

搜索詞

 
 

結果集

 
 

用時

 
 

搜索詞

 
 

結果集

 
 

用時

 
 

16

 
 

msgBody

 
 

%<span  style="font-family: 宋體;">家長%

 
 

532790

 
 

10798

 
 

家長

 
 

532790

 
 

3406

 
 

17

 
 

msgBody

 
 

%<span  style="font-family: 宋體;">家長%

 
 

532790

 
 

10501

 
 

家長

 
 

532790

 
 

375

 
 

23

 
 

msgTo

 
 

%1%

 
 

999949

 
 

2906

 
 

1*

 
 

999943

 
 

19609

 
 

24

 
 

msgTo

 
 

%1%

 
 

999949

 
 

2454

 
 

1*

 
 

999943

 
 

45750

 
 

25

 
 

msgTo

 
 

'%1%

 
 

999949

 
 

2375

 
 

1*

 
 

999943

 
 

5969

 

491<spanstyle='font-family:宋體'>萬數據組是:

                                                                                                                                                                                                                                                           
 

 

 
 

 

 
 

SQL

 
 

Lucene

 
 

<span  style="font-size: 12pt; font-family: 宋體;">用例

 
 

搜索字段

 
 

搜索詞

 
 

結果集

 
 

用時

 
 

搜索詞

 
 

結果集

 
 

用時

 
 

4

 
 

ID

 
 

3%

 
 

1103743

 
 

4453

 
 

 

 
 

 

 
 

 

 
 

5

 
 

ID

 
 

3%

 
 

1103743

 
 

4829

 
 

 

 
 

 

 
 

 

 
 

17

 
 

 

 
 

 

 
 

 

 
 

 

 
 

家長

 
 

349

 
 

157

 
 

17

 
 

 

 
 

 

 
 

 

 
 

 

 
 

家長

 
 

349

 
 

16

 
 

17

 
 

 

 
 

 

 
 

 

 
 

 

 
 

家長

 
 

349

 
 

0

 
 

20

 
 

 

 
 

 

 
 

 

 
 

 

 
 

 
 

168364

 
 

500

 
 

20

 
 

 

 
 

 

 
 

 

 
 

 

 
 

 
 

168364

 
 

31

 
 

20

 
 

 

 
 

 

 
 

 

 
 

 

 
 

 
 

168364

 
 

16

 
 

30

 
 

msgTo

 
 

'%1%

 
 

4909927

 
 

64126

 
 

 

 
 

 

 
 

 

 
 

30

 
 

msgTo

 
 

'%1%

 
 

4909927

 
 

46563

 
 

 

 
 

 

 
 

 

 
 

30

 
 

msgTo

 
 

'%1%

 
 

4909927

 
 

44941

 
 

 

 
 

 

 
 

 

 

相比之下,重複測試帶來的性能提升在<spanlang=en-us>Lucene表現得更爲明顯。

 

<spanlang=en-us style="font-family: Wingdings;">Ø        橫向比較

我們現在逐條數據地比較<spanlang=en-us>SQL數據庫與Lucene數據庫的用時差異,可以發現,當返回結果集不是太大(少於<spanlang=en-us>100萬組)的情況下,一般來說Lucene的表現是比<spanlang=en-us>SQL要好的。尤其是在SQL被查詢列沒有做索引,而該查詢列剛好又是長文本列的時候。用時有時可以相關上百倍。但當結果集比較大時,<spanlang=en-us>Lucene用時會急劇上升,有時甚至無法終止。此時,程序佔用物理內存大約在<span lang=en-us>700M上下,佔用虛擬內存大約在<span lang=en-us>1G上下,CPU佔用一開始很高,但約兩秒後下降至幾可忽略,硬盤燈狂閃,但任務管理器顯示<spanlang=en-us>IO並無太大變化,所以懷疑是內存抖動造成頻繁調頁,使得系統性能急劇下降。

 

<spanlang=en-us style="font-family: Wingdings;">Ø        表間比較

作<spanlang=en-us>SQL對比表,選出兩表中搜索詞相同的項,並使之一一對應(相同項僅保留第一次測試的結果),得:

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
 

 

 
 

 

 
 

 

 
 

100SQL

 
 

491SQL

 
 

 

 
 

<span  style="font-family: 宋體;">用例

 
 

搜索字段

 
 

SQL搜索詞

 
 

結果集

 
 

用時

 
 

 

 
 

用時

 
 

用時增長

 
 

3

 
 

ID

 
 

1234

 
 

1

 
 

1453

 
 

1

 
 

5578

 
 

3.8389539

 
 

2

 
 

ID

 
 

1%

 
 

153660

 
 

1250

 
 

1088349

 
 

4453

 
 

3.5624

 
 

4

 
 

ID

 
 

2%

 
 

110981

 
 

1109

 
 

1106148

 
 

4595

 
 

4.1433724

 
 

5

 
 

ID

 
 

3%

 
 

108023

 
 

1094

 
 

1103743

 
 

4453

 
 

4.0703839

 
 

6

 
 

ID

 
 

111_

 
 

10

 
 

1437

 
 

10

 
 

5391

 
 

3.7515658

 
 

7

 
 

ID

 
 

1%2%

 
 

66133

 
 

1578

 
 

503923

 
 

6735

 
 

4.2680608

 
 

8

 
 

ID

 
 

7%8%

 
 

44493

 
 

1531

 
 

44493

 
 

5297

 
 

3.4598302

 
 

9

 
 

ID

 
 

4_5_

 
 

100

 
 

1406

 
 

100

 
 

5579

 
 

3.9679943

 
 

10

 
 

senderName

 
 

%

 
 

4753

 
 

1235

 
 

42840

 
 

46850

 
 

37.935223

 
 

11

 
 

senderName

 
 

%<span  style="font-family: 宋體;">林%

 
 

9124

 
 

1141

 
 

63667

 
 

52552

 
 

46.057844

 
 

12

 
 

senderName

 
 

%<span  style="font-family: 宋體;">林雨%

 
 

6

 
 

1141

 
 

5

 
 

45318

 
 

39.717791

 
 

13

 
 

senderName

 
 

%<span  style="font-family: 宋體;">家長%'

 
 

103

 
 

1141

 
 

349

 
 

49880

 
 

43.716039

 
 

14

 
 

msgBody

 
 

%<span  style="font-family: 宋體;">林%'

 
 

17579

 
 

14767

 
 

168364

 
 

72572

 
 

4.9144715

 
 

15

 
 

msgBody

 
 

%<span  style="font-family: 宋體;">林雨%

 
 

46

 
 

14595

 
 

131

 
 

73759

 
 

5.053717

 
 

16

 
 

msgBody

 
 

%<span  style="font-family: 宋體;">家長%

 
 

532790

 
 

10798

 
 

3196271

 
 

91398

 
 

8.4643452

 
 

18

 
 

msgBody

 
 

'%<span  style="font-family: 宋體;">小學%

 
 

61657

 
 

14861

 
 

646573

 
 

73936

 
 

4.9751699

 
 

19

 
 

msgBody

 
 

%<span  style="font-family: 宋體;">小%

 
 

132968

 
 

14439

 
 

1049424

 
 

68300

 
 

4.7302445

 
 

21

 
 

msgBody

 
 

%<span  style="font-family: 宋體;">你的孩子已於%

 
 

680

 
 

14876

 
 

680

 
 

76211

 
 

5.1230842

 
 

23

 
 

msgTo

 
 

%1%

 
 

999949

 
 

2906

 
 

4909927

 
 

64126

 
 

22.066758

 
 

26

 
 

msgTo

 
 

%13%

 
 

998059

 
 

2547

 
 

4859042

 
 

45535

 
 

17.877896

 
 

28

 
 

msgTo

 
 

139222%

 
 

3371

 
 

921

 
 

20006

 
 

51709

 
 

56.144408

 
 

29

 
 

msgTo

 
 

139222%9

 
 

345

 
 

1750

 
 

1804

 
 

219443

 
 

125.396

 
 

30

 
 

msgTo

 
 

13912345678

 
 

74

 
 

1672

 
 

78

 
 

47817

 
 

28.598684

 
 

31

 
 

msgTo

 
 

1_9_2_0_0_9

 
 

95

 
 

1766

 
 

186

 
 

48020

 
 

27.191393

 
 

32

 
 

msgTo

 
 

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

 
 

710

 
 

3891

 
 

3903

 
 

53240

 
 

13.682858

 

可見,隨着數據庫數據量的增大,所有的測試用例用時均有不同程度的增長。其中,用時增長幅度在<spanlang=en-us>3~8倍的有14組。此外,還有也有<spanlang=en-us>11組增長幅度更大。

 

用同樣的方法制作<spanlang=en-us>Lucene對比表:

                                                                                                                                                                                                                                                                                                                                                                                                           
 

 

 
 

 

 
 

 

 
 

100Lucene

 
 

491Lucene

 
 

 

 
 

<span  style="font-size: 12pt; font-family: 宋體;">用例

 
 

搜索字段

 
 

Lucene搜索詞

 
 

結果集

 
 

用時

 
 

結果集

 
 

用時

 
 

用時增長

 
 

3

 
 

ID

 
 

1234

 
 

1

 
 

2047

 
 

1

 
 

390

 
 

0.190523

 
 

6

 
 

ID

 
 

111?

 
 

10

 
 

63

 
 

10

 
 

812

 
 

12.88889

 
 

8

 
 

ID

 
 

7*8*

 
 

44493

 
 

2750

 
 

44493

 
 

1641

 
 

0.596727

 
 

9

 
 

ID

 
 

4?5?

 
 

100

 
 

735

 
 

100

 
 

844

 
 

1.148299

 
 

11

 
 

senderName

 
 

 
 

9124

 
 

281

 
 

63667

 
 

594

 
 

2.113879

 
 

12

 
 

senderName

 
 

林雨

 
 

6

 
 

78

 
 

6

 
 

63

 
 

0.807692

 
 

13

 
 

senderName

 
 

家長

 
 

103

 
 

32

 
 

349

 
 

157

 
 

4.90625

 
 

14

 
 

msgBody

 
 

 
 

17579

 
 

219

 
 

168364

 
 

500

 
 

2.283105

 
 

15

 
 

msgBody

 
 

林雨

 
 

46

 
 

78

 
 

131

 
 

172

 
 

2.205128

 
 

16

 
 

msgBody

 
 

家長

 
 

532790

 
 

3406

 
 

3196271

 
 

31846

 
 

9.349971

 
 

18

 
 

msgBody

 
 

小學

 
 

61679

 
 

890

 
 

646623

 
 

11298

 
 

12.69438

 
 

19

 
 

msgBody

 
 

*

 
 

132968

 
 

32

 
 

1049424

 
 

469

 
 

14.65625

 
 

21

 
 

msgBody

 
 

你的孩子已於

 
 

680

 
 

2828

 
 

680

 
 

38097

 
 

13.47136

 
 

28

 
 

msgTo

 
 

139222*

 
 

3371

 
 

15

 
 

20006

 
 

969

 
 

64.6

 
 

29

 
 

msgTo

 
 

139222*9

 
 

345

 
 

78

 
 

1804

 
 

32

 
 

0.410256

 
 

30

 
 

msgTo

 
 

13912345678

 
 

74

 
 

171

 
 

78

 
 

16

 
 

0.093567

 
 

31

 
 

msgTo

 
 

1?9?2?0?0?9

 
 

95

 
 

125

 
 

186

 
 

438

 
 

3.504

 
 

32

 
 

msgTo

 
 

1*9*2*0*0*9

 
 

710

 
 

219

 
 

3903

 
 

562

 
 

2.56621

 

可見,<spanlang=en-us>Lucene的搜索用時增幅遠較SQL數據庫爲小,有<spanlang=en-us>5個用例甚至出現了負增長。這說明Lucene數據庫的搜索用時較不穩定,受除被搜索數據的規模以外的因素影響較大。

 

 

<spanlang=en-us style="font-size: 14pt; font-family: 宋體-方正超大字符集;">五、<spanstyle='font:7.0pt times="" new="" roman="">       原因分析

要分析產生上述各種現象的原因,首先要對<spanlang=en-us>SQL數據庫與Lucene數據庫的數據結構及算法實現有一個簡單的瞭解。

(補數據庫實現原理<spanlang=en-us>)

由於關係型數據庫的查找採用順序遍歷表的方法,因此它的查找用時是與表規模和被查找列的數據量成正比的。縱向比較的規律<spanlang=en-us>1證實了這一點。

Lucene數據庫使用了一個倒排文件索引來提供快速查找。該索引按關鍵詞的字典序進行排序。從而使該索引支持快速的二分查找,相比於海量的文件內容而言,關鍵詞的數量是微不足道的,所以這一步所需時間非常短,在本測試中,它花費的時間是毫秒級的。

Lucene在索引中記錄了出現了該關鍵詞的記錄號、出現次數、位置等信息。因此,可以在海量的記錄集中快速地定位該關鍵詞的位置。從整體的方面來說,<spanlang=en-us>Lucene的倒排索引相當於實現了一個Hash表。我們知道,<spanlang=en-us>Hash表的查找複雜度是O(1)的,也就是說,<spanlang=en-us>Lucene的查找用時幾乎與記錄集的規模無關。這一點在《100萬組數據測試統計表》與《<spanlang=en-us>491萬組數據測試統計表》的對比中體現得非常明顯。

Lucene數據庫在索引中的檢索速度很快,但每匹配一個記錄後,就要進行一次磁盤的讀寫以獲取相關的數據。同時,用<spanlang=en-us>Java實現的Luene無論是在程序執行效率上、內存使用效率上還是文件的<spanlang=en-us>IO效率上,都要比編譯成二進制代碼的SQL server要低,這種先天不足使得<spanlang=en-us>Lucene在生成結果集的效率較低,縱向比較中的規律2證實了這一點。

 

<spanlang=en-us style="font-size: 14pt; font-family: 宋體-方正超大字符集;">六、<spanstyle='font:7.0pt times="" new="" roman="">       結論:關係型數據庫與Lucene數據庫的適用場合

關係型數據庫的適用場合

<spanlang=en-us style="font-family: Wingdings;">        涉及多種類型數據的處理(包括數值、二進制流等)

<spanlang=en-us style="font-family: Wingdings;">        複雜的查詢類型(如組合查詢等)

<spanlang=en-us style="font-family: Wingdings;">        複雜的權限和事務管理。

<spanlang=en-us style="font-family: Wingdings;">        需要處理結果集中的所有數據(如數據轉換)

<spanlang=en-us style="font-family: Wingdings;">        統計分析。

 

Lucene數據庫的適用場合

<spanlang=en-us style="font-family: Wingdings;">        對大文本的匹配查找。

<spanlang=en-us style="font-family: Wingdings;">        對文本的模糊匹配查找。需要匹配度控制的場合

<spanlang=en-us style="font-family: Wingdings;">        基於詞元的匹配

<spanlang=en-us style="font-family: Wingdings;">        只需處理結果集中的小部分數據(通常是指匹配度最高的數據),並且需要很高效地取出這些數據,如搜索引擎。

 

可見,兩種類型數據庫的適用場合差別是相當明顯的。在實際應用中,應該根據數據特點和應用需求來決定採用哪一種形式的數據庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章