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