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