1. 程式人生 > >lucene3.5與mysql 查詢效能的對比

lucene3.5與mysql 查詢效能的對比


由於最近做畢設,需要做一個商品查詢模組,用到了lucene來做商品索引的查詢,原因為:

1.marks(商品標籤)欄位含有多個標籤,當針對某個標籤查詢時,或許只能用like 查詢,這樣的查詢慢! 2.沒用過lucene,想用來測試下效能 可能結果早就顯而易見,但是這次測試我要的是資料,不僅僅是結果,所以別說什麼你們知道答案類似的話~ 言歸正傳,我的設計是這樣的:
  而,效能對比,對比的就是搜尋條件,是在lucene快,還是直接去mysql快! 我的lucene模組提供了兩種索引方式,      一種是建立索引在檔案中,需要查詢時在索引檔案中去查詢      二是在記憶體中建立索引,需要時直接再記憶體中查詢 由於第二種方式明顯快於第一種(設計第一種的原因是,索引僅僅在記憶體是不夠的,需要持久化,不能每次都重新拉資料再建立索引),所以僅僅是放上測試資料,僅作對比! 說明: 1.MYSQL只有主鍵索引,marks欄位建有索引,但是通過 explain  select * from t_baobei   t where     t.baoBeiMarks like '%手'  ; explain  select * from t_baobei   t where     t.baoBeiMarks like '%手%'  ;
explain  select * from t_baobei   t where     t.baoBeiMarks like '手%'  ; 三種情況確認,該SQL語句沒有用到索引 2.lucene分詞器用的是 StandardAnalyzer() 測試1: (1W條資料) 建立索引在檔案中:            index's num is 10000            create  use : 1953 ms           search  use : 547 ms 建立索引在記憶體中:            index's num is 10000            create  use : 1046 ms
search  use : 94 ms MYSQL中: SQL 語句為 SELECT * from t_baobei t  WHERE t.baoBeiMarks like   '%手機%'    search  use : 16ms--40ms 測試2: (3W條資料) 建立索引在檔案中:                       第一次            index's num is 30000            create  use : 2641 ms            search  use : 609ms
           第二次                      index's num
 is 30000
           create  use : 3063 ms            search  use : 563ms            第三次            index's num is 30000            create  use : 3704 ms            search  use : 547ms            第四次:刪除已有索引,索引大小3M            index's num is 30000            create  use : 2500 ms            search  use : 531ms   可以看出:            1.建立索引的耗時隨記錄數的增加而增加,3W條資料的平均耗時為3S以上,資料量是原來的3倍,耗時自是1.5倍                      2.從1W到3W,搜尋耗時增加不大 建立索引在記憶體中:            index's num is 30000            create  use : 1687 ms search  use : ~94 ms(搜尋'手'); search  use : ~110 ms(搜尋'手機'); 可以看出:            1.和1W資料在記憶體中建立和搜尋比,資料量是原來的3倍,建立耗時是原來1.5倍,搜尋耗時比本沒有差別            2.和在檔案中建立和搜尋索引比,同樣的資料量(3W),建立耗時減少一半,搜尋耗時,減少一個數量級!!            3.和MYSQL 相比四種like方式來說,基本沒有競爭優勢,除最耗時的第一條SQL外,其餘mysql均只有lucene的20% MYSQL中:  * (30000條資料)       [SQL] SELECT * from t_baobei t  WHERE t.baoBeiMarks like   '%手%'       時間: 140ms       [SQL] SELECT * from t_baobei t  WHERE t.baoBeiMarks like   '手%'       時間: 30ms       [SQL] SELECT * from t_baobei t  WHERE t.baoBeiMarks like   '%手機%'       時間: 16ms --40ms       [SQL] SELECT * from t_baobei t  WHERE t.baoBeiMarks like   '手機%'       時間: 16ms --40ms     PS: 發現一個有趣的現象,不同的like方式的寫法,搜尋時間差距這麼大.字元越少,%越多,粒度就越細.耗時越嚴重
  • e3086a66-8ffe-357a-bcd5-ffa15ae53b8a-thumb.png
  • 大小: 23.6 KB