數據庫優化指南

選用合適數據庫

SQL

SQL Server、MySQL(根據事務選擇存儲引擎)、Oracle

NoSQL

鍵值型數據庫、文檔型數據庫、搜索引擎、列式存儲和圖形數據庫。

表設計

  1. 表結構遵循第三範式原則;
  2. 如果分析查詢應用比較多,尤其是需要進行多表聯查的時候,可以採用反範式進行優化。反範式採用空間換時間的方式,通過增加冗餘字段提高查詢的效率;
  3. 表字段的數據類型選擇,關係到了查詢效率的高低以及存儲空間的大小。一般來說,如果字段可以採用數值類型就不要採用字符類型;字符長度要儘可能設計得短一些。針對字符類型來說,當確定字符長度固定可以採用 CHAR 類型;當長度不固定通常採用VARCHAR 類型。

優化邏輯查詢

邏輯查詢優化

對 SQL 語句進行等價變化,重寫查詢(子查詢、等價謂詞、視圖重寫、條件簡化、連接消除、嵌套連接消除)

物理查詢優化

物理查詢優化是將邏輯查詢的內容變成可以被執行的物理操作符,從而爲後續執行器的執行提供準備。它的核心是高效地建立索引,並通過這些索引來做各種優化。

建立索引注意事項:

  1. 數據重複度高,就不需要創建索引。通常在重複度超過 10% 的情況下,可以不創建這個字段的索引;
  2. 要注意索引列的位置對索引使用的影響;
  3. 要注意聯合索引對索引使用的影響;
  4. 要注意多個索引對索引使用的影響。

使用 Redis 或 Memcached 作爲緩存

因爲數據都是存放到數據庫中,我們需要從數據庫層中取出數據放到內存中進行業務邏輯的操作,當用戶量增大的時候,如果頻繁地進行數據查詢,會消耗數據庫的很多資源。如果我們將常用的數據直接放到內存中,就會大幅提升查詢的效率。

鍵值型數據庫可以幫助我們解決上述問題。

從支持的數據類型來說, Redis 比 Memcached 要多,它不僅支持 key-value 類型的數據,還支持 List,Set,Hash 等數據結構。 當我們有持久化需求或者是更高級的數據處理需求的時候,就可以使用 Redis 。如果是簡單的 key-value 存儲,則可以使用 Memcached 。

庫級優化

如果讀和寫的業務量都很大,並且它們都在同一個數據庫服務器中進行操作,那麼數據庫的性能就會出現瓶頸,這時爲了提升系統的性能,優化用戶體驗,我們可以採用讀寫分離的方式降低主數據庫的負載,比如用主數據庫( master )完成寫操作,用從數據庫( slave )完成讀操作。除此以外,我們還可以對數據庫分庫分表。

垂直切分、水平切分

垂直切分

數據表過多,可以採用垂直分庫的方式,將關聯的數據表部署在一個數據庫上。列過多,可以採用垂直分表的方式,將數據表分拆成多張,把經常一起使用的列放到同一張表裏。

水平切分

採用垂直分表的形式,就是將一張數據表分拆成多張表,採用水平拆分的方式,就是將單張數據量大的表按照某個屬性維度分成不同的小表(將大的數據表分拆成不同的子表,每張表保持相同的表結構)
eg:把不同年份的數據放到不同的數據表中。

總結

本文從數據庫的選取、表的設計、查詢的優化、使用鍵值型數據庫幫助以及庫級別的優化幾個方向提供了數據庫優化的思路,具體的優化案例請期待後續博客。

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