1. 程式人生 > >Java Web實戰篇-輕鬆提高千萬級資料庫查詢效率

Java Web實戰篇-輕鬆提高千萬級資料庫查詢效率

資料查詢.jpeg

大家在剛開始搭建專案的時候可能考慮的不夠全面,隨著產品的推廣 、業務場景的複雜和使用使用者越來越多 資料會呈現快速增長。當資料達到千萬級的時候 就會發現 查詢速度越來越慢 使用者體驗也就越來越差,那怎樣提升千萬級資料查詢效率呢?小萌簡單整理了一下,希望對大家有所幫助!

優化資料庫設計:

  1. 資料欄位型別使用varchar/nvarchar 替換 char/nchar,變長欄位儲存空間小,節省儲存空間。在查詢的時候小的空間欄位搜尋效率更高。
  2. 查詢的時候避免全表掃描,可以在whereorder by 的欄位上建立索引。
  3. where 查詢子句中不對null值做判斷,會導致檢索引擎放棄使用索引而使用全表掃描,如:select id,name from user where age is null 可以設定age 的預設值為0
    ,保證沒有null值,修改後的sql查詢語句為:select id,name from user where age = 0
  4. 謹慎使用索引,索引不是越多越好。一般一張表的索引數不要超過6個,如果太多要討論業務是否合理或者是否索引建在了不常用的欄位上。索引可以提高select 查詢的效率,但是也響應降低了 insert和update 的效率,因為在執行insert和update時也可能會重建索引。
  5. 儘量不要更新索引資料,因為索引資料的順序是表記錄的物理順序,一旦發生改變將會導致整個表記的順序發生改變,將會消耗大量資源。如果業務需要頻繁更新索引資料列 就要考慮索引是否建立合理,比如 使用者ID、身份證號碼或者手機號碼不經常改變的列可以考慮建立索引。
  6. 字元型欄位如果符合業務需求可以修改為數字型別欄位,因為字元型欄位會降低查詢和連線的效能,並且增加儲存的開銷。執行搜尋的適合查詢和連線會逐個比較字串的每一個字元,如果是資料型別比對一次就可以了。

SQL查詢優化

  1. where 查詢語句中避免使用!= <> 操作符,搜尋引擎會執行全表掃描而不執行建立的索引。
  2. where 查詢語句中 避免使用 or 來連線條件查詢資料,也會導致搜尋引擎執行全表掃描而不執行建立的索引,例如:select id,name from user where age = 18 or age = 25 可以修改為 select id,name from user where age = 18 union all select id,name from user where age = 25
  3. * in 和 not in*也避免使用,也將導致全表掃描,例如:select id,name from user where age in (18,19,20) 如果是連續的則可以考慮使用between and,例如:select id,name from user where age between 18 and 20
  4. like 語句導致全表掃描,例如:select id,name from user where name like ‘%微信%’
  5. wehre 查詢語句中避免使用引數,也會全表掃描,SQL在執行時才會進行區域性變數的解析,優化程式不能將訪問計劃的選擇推遲到執行時;它必須在編譯時進行選擇。如果編譯時建立訪問計劃,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:select id,name from user where age = @age 當然也可以改為強制使用索引:select id,name from user with(index(索引名)) where age [email protected] age
  6. where查詢語句避免使用表示式,也會導致查詢的時候放棄使用索引導致全表掃描。例select id,name from user where age/2 = 10 可以更改為 * select id,name from user where age = 10*2*
  7. where查詢語句避免使用函式操作,也會導致查詢的時候放棄使用索引導致全表掃描。例如:select id,name from user where substring(name,1,3)=’abc’ 可以改為select id,name from user where name like ‘abc%’
  8. 不要使用select * from user 查詢,要用具體的欄位名。不要返回任何用不到的欄位。
  9. 不要使用遊標,大家都知道遊標的效率非常差。
  10. 避免出現大實務業務,會降低系統的併發能力。

Java後臺優化

  1. 使用JDBC連線資料庫。
  2. 合理使用資料快取。
  3. 控制好記憶體,不要全部資料放到內出做處理,可以邊讀邊處理。
  4. 少創造物件。

資料庫效能優化

  1. 使用儲存過程

    如果在具體業務實現過程中,可以使用儲存過程操作資料庫可以儘量使用,由於儲存過程是存放在資料庫伺服器上的一次性被設計、編碼、測試,被再次呼叫,需要執行該儲存過程可以很簡單的使用。可以提高響應速度,減少網路使用流量等等。
  2. 硬體調整

    影響資料庫效能的也可能是磁碟和網路吞吐量,可以通過擴大虛擬記憶體,把資料庫伺服器和主伺服器分開部署。資料伺服器吞吐量調為最大。
  3. 調整資料庫

    如果在實際業務實現中對錶查詢頻率過高,可以對錶建立索引;按照where查詢條件建立索引,儘量為整型鍵建立為有且只有一個簇集索引,資料在物理上按順序在資料頁上,縮短查詢範圍,為在查詢經常使用的全部列建立非簇集索引,能最大地覆蓋查詢;但是索引不可太多,執行UPDATE DELETE INSERT語句需要用於維護這些索引的開銷量急劇增加;避免在索引中有太多的索引鍵;避免使用大型資料型別的列為索引;保證每個索引鍵值有少數行。

    跟多實戰資訊請關注“IT實戰聯盟”公號哦~~~