數據庫操作有多慢

   “數據庫操作很慢”,“儘量避免數據庫操作”這些話已經早已深入我心,但可笑的是從未實驗過。現在恰巧喲這麼個機會,簡單的實驗一下吧

 

    現在有一張表,有25字段,只有ID有索引(主鍵),該表存儲了20488條數據,導出的sql有11.1M。

 

    項目中的是struts2+spring+ibatis,賴的費事,就直接在service中以併發1的情況下比較了一下速度(耗時)。

 

 

實驗1

 

查詢1:利用"where 1 = 1 and  P_ID=?   "去查詢(其中P_ID沒有索引)

測試結果:直接查詢數據庫用時47ms(32,699,268ns),獲取數據89條。

 

 

 

 

查詢2:

a.首先把2萬條數據都查出來放到ArrayList中(不計算在時間內)

b.for循環ArrayList並對比P_ID

測試結果:FOR循環 20488條數據用時0ms(7,086,888ns),獲取數據89條。(呵呵,(System.currentTimeMillis() - start)已經滿足不了我們的需求了)

 

 

實驗1結果:

此種情況下查詢2比查詢1快了(32,699,268/7,086,888)=4.6倍。

 

 

 

 

 

實驗2

 

查詢1:利用"where 1 = 1 and  ID=?   "去查詢(其中ID是主鍵

查詢1測試結果:直接查詢數據庫用時11,589,130ns,獲取數據1條。

 

查詢2:仍舊採用遍歷ArrayList,對比ID方式

查詢2測試結果:for循環 20,488條數據用時2,456,200ns,獲取數據1條。

 

 

實驗2結果:

此種情況下查詢2比查詢1快了( 11,589,130 /  2,456,200)=4.7倍。

 

 

 

結論:

1.for循環方式比直接查找數據庫快了4.5倍以上,與是否有主鍵差別不大。

 

疑問:

1.“查詢2測試結果”和“查詢2測試結果”同時:for循環 20488次,但耗時盡然差了(7086888/2456200)=2.8853057568601908倍,很是不解。即使去除for中間的tempList.add(o);也是如此。

很奇怪啊if (o.getID().equals(pid))明顯快於if (o.getP_ID().equals(pid))。


 

 

 

 

 

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