簡體   English   中英

我怎么知道什么時候索引一個列,用什么?

[英]How do I know when to index a column, and with what?

在各種ORM的文檔中,他們總是提供一種創建索引的方式,等等。他們總是提到要確保創建適當的索引以提高效率,就好像這是需要使用SQL的非手寫SQLer的固有知識一樣。 ORM。 我對索引的理解(在PK之外)基本上是:如果您打算基於列的內容進行LIKE查詢(即搜索),則應對該列使用全文本索引。 關於索引(主要與效率有關),我還應該了解什么? 我感覺自己家門口就有一個知識世界,但是下面藏着一塊巨大的折疊式鼠標墊,所以我無法通過(我不知道為什么我覺得我需要這樣說,但是感謝您提供沙發)。

可以將索引大致想象成書后的索引。 這是與書本內容完全不同的區域,如果您要尋找一些特定的值,則可以轉到索引並查找(索引是有序的,因此查找內容比掃描書的每一頁要快得多) )。

索引條目具有頁碼,因此您可以快速進入尋找主題的頁面。 數據庫索引非常相似。 它是數據庫中相關信息(索引中包含的字段)的有序列表,其中包含供數據庫查找匹配記錄的信息。

所以...當您有需要經常搜索的信息時,將創建一個索引。 普通索引不能像LIKE查詢那樣幫助您進行“部分”查找,但是任何時候您需要獲得一組結果(其中字段X具有特定值)時,它們都會使DBMS不必“掃描”整個表,尋找匹配的值。

當您需要對列進行排序時,它們也有幫助。

要記住的另一件事; 如果DBMS允許您創建具有多個字段的單個索引,請確保調查這樣做的效果,具體針對您的DBMS。 如果在查詢中使用了所有字段,那么包含多個字段的索引可能僅是全部(或根本)有用。 相反,對於單個表具有多個索引,每個索引只有一個字段,對於按多個字段進行過濾/排序的查詢可能沒有多大(或沒有)幫助。


您提到了全文索引和PK(主鍵)。 盡管它們通常具有相似的目的,但它們與常規索引不同。

首先,請注意,主鍵通常是一個索引(實際上,在MSSQL中是“聚集索引”),但是並不需要特別如此。 例如,默認情況下,MSSQL PK是聚集索引。 聚集索引的特殊之處在於它們不是存儲在其他位置的單獨數據位,而是數據本身按聚集索引的順序排列在表中。 這就是為什么流行的PK是一個int值,它會隨着順序增加的值自動生成的原因。 因此,聚簇索引專門根據字段的值對表中的數據進行排序。 將此與傳統詞典進行比較; 條目本身由“關鍵字”(定義的單詞)排序。

但是在MSSQL中(請查看DBMS文檔以獲取信息),可以根據需要將“聚簇索引”更改為其他字段。 有時,這是在基於datetime的字段上完成的。


全文索引完全是不同種類的野獸。 它們使用一些相同的原理,但是它們在做什么與我正在描述的普通索引並不完全相同。 另外:在某些DBMS中, LIKE查詢使用全文本索引; 需要特殊的查詢運算符。

這些索引是不同的,因為它們的目的不是在列的整個值(數字,日期,一小部分字符數據)上查找/排序,而是在文本字段中查找單個詞/短語被索引。

它們通常還可以搜索相似的單詞,不同的時態,常見的拼寫錯誤等,並且通常會忽略雜音單詞。 他們工作的不同方式是為什么他們還可能需要不同的操作員來使用它們的原因。 (同樣,請檢查您的本地DBMS文檔!)

這個答案是特定於Oracle的,但是答案中的要點適用於大多數關系數據庫系統

如何選擇和優化Oracle索引?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM