數據庫,索引優秀實踐
處理數據庫索引的簡短指南
數據庫索引通常很糟糕。只有在設計和有效地使用時才實現數據庫索引的權力。否則,索引是磁盤空間和數據庫性能的純粹浪費。但是你不想浪費磁盤空間,所以讓我們快速通過一些您需要正確設計和使用索引所需的內容。
只有一個原因創建數據庫索引 - 僅在數據庫上提供現有或將來的查詢負載,即必須根據當前或預期的使用設計索引。所有主要數據庫都提供了一種監控索引使用的方法。
使用where子句
SQL查詢中的WHERE子句過濾數據。索引在基于某些關鍵列以預定義的順序存儲數據時,在濾除數據中有助于濾除數據。如果查詢使用這些鍵列,將使用索引,濾波器將更快。
當在Where子句中引用密鑰列時,索引的存在不保證其使用情況。因此,您必須確保正在使用索引。大多數數據庫都有一個名為查詢引擎的組件,該組件決定了許多執行計劃中的哪一個來確保查詢的最快結果。
查詢引擎伴隨著解釋命令,幫助我們獲取執行計劃并列出計劃的每一步的成本。
有效地使用數據類型
數據庫支持只有少量數據類型。已創建所有數據類型以提供特定目的。如果您不使用旨在服務該目的的數據類型,您將在數據庫上放入額外的負載以進行隱式鑄造,額外的磁盤空間等。
避免的簡單方法是使用DateTime來存儲日期和時間,使用整數來存儲整數。不要使用VARCHAR將所有內容從數字存儲到JSON對象。大多數數據庫現在支持JSON作為本機數據類型。這意味著您可以使用SQL有效地存儲和檢索來自數據庫中的JSON對象的數據。
不要過度索引
索引創建必須在利用磁盤空間,增加管理開銷和增加查詢性能之間進行平衡。您無法創建索引以將空間保存為數據庫查詢性能。您還無法在所有列上創建索引以提供所有查詢。它不像那樣工作。
您必須通過識別以下內容來檢查查詢工作負載 -
- 用于過濾Filter數據的列。
- 用于聯結Join表的列。
- 用于排序Order數據的列。
- 用于分組Group數據的列。
- 用于過濾,Join,Oder或Group的組合使用的列。
這五件事將決定需要創建多少個索引,索引列應該在索引中有什么組合,優先順序。
請注意,Column_P上的索引IDX_A,Column_Q DESC與
- Column_Q中的索引IDX_A,列P或,
- index idx_b在column_p desc上,列q
還要確保您使用一些工具或腳本來標識數據庫中是否存在重復索引。
知道不使用索引時
謹防樣品條款的誘惑。這是一個指數殺手。知道索引的第一列必須始終存在于要使用的查詢的過濾器,訂單,加入或組操作中。如果您使用LACE子句使用索引過濾數據,則您應該知道您無法期望索引在類似于“%的東西”中的內容。
當數據庫引擎無法隱式地映射數據類型,字符集或索引列的排序時,也沒有使用索引。有關此內容的更多詳細信息,并查找更多關于索引的限制,請使用此鏈接。
結論
如果未正確使用,數據庫索引可以證明是在反轉的角色中,即,它們可以妨礙數據庫的性能而不是增強它。為確保數據庫由于索引不良而受到影響,請確保正確索引管理,經常探望索引,并正確分析新索引創建。