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