了不了解索引的原理,其實根據資料的大小有很大的關係,其實很多事情你會發現,資料量1萬以下不是個事情,但是如果資料量達到了1000萬之類的量級,那麼優化,查詢可能就是會成為瓶頸。所以說,很多系統都是資料量小都不是問題,資料量一大,基本上就全是問題了。說白了,索引問題就是乙個查詢問題。。。
資料庫索引,是資料庫管理系統中乙個排序的資料結構,以協助快速查詢、更新資料庫表中資料。索引的實現通常使用b樹及其變種b+樹。
在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。
為表設定索引要付出代價的:一是增加了資料庫的儲存空間,二是在插入和修改資料時要花費較多的時間(因為索引也要隨之變動)。應該在哪些地方建立索引哪?
- 在經常需要搜尋的列上,可以加快搜尋的速度;
- 在作為主鍵的列上,強制該列的唯一性和組織表中資料的排列結構;
- 在經常用在連線的列上,這些列主要是一些外來鍵,可以加快連線的速度;
- 在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的;
- 在經常需要排序的列上建立索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
- 在經常使用在where子句中的列上面建立索引,加快條件的判斷速度。
哪些列不應該建立索引哪?
索引的分類
根據資料庫的功能,可以在資料庫設計器中建立三種索引:唯一索引、主鍵索引和聚集索引。
唯一索引
唯一索引是不允許其中任何兩行具有相同索引值的索引。
當現有資料中存在重複的鍵值時,大多數資料庫不允許將新建立的唯一索引與表一起儲存。資料庫還可能防止新增將在表中建立重複鍵值的新資料。例如,如果在employee表中職員的姓(lname)上建立了唯一索引,則任何兩個員工都不能同姓。
主鍵索引
資料庫表經常有一列或列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。
在資料庫關係圖中為表定義主鍵將自動建立主鍵索引,主鍵索引是唯一索引的特定型別。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對資料的快速訪問。
聚集索引
在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。乙個表只能包含乙個聚集索引。
如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的資料訪問速度。
什麼叫聚集索引和非聚集索引
聚集索引:
聚集索引,**於生活嘗試。這中索引可以說是按照資料的物理儲存進行劃分的。對於一堆記錄來說,使用聚集索引就是對這堆記錄 進行堆劃分。即主要描述的是物理上的儲存。非聚集索引:舉個例子:
誤區:比如圖書館新進了一批書。那麼這些書需要放到圖書館內。書如何放呢?一般都有乙個規則,雜誌類的放到101房間,文學類的放到102房間,理工類的放到103房間等等。這些儲存的規則決定了每本書應該放到**。而這個例子中聚集索引為書的類別。
正式因為這種儲存規則,才導致 聚集索引的唯一性。
就不是唯一的了。有的人認為,聚集索引的字段是唯一的。這是因為sql server 中新增主鍵的時候,自動給主鍵所在的字段生成乙個聚集索引。所以人們會認為聚集索引所加的字段是唯一的。
思考一下上面這個問題。雜誌類的書放到101房間。那麼如果雜誌類的書太多,乙個101房間存放不下。那麼可能101,201兩個房間來存放雜誌類的書籍。如果這樣分析的話,那麼乙個雜誌類對應多個房間。放到表儲存的話,那麼這個類別字段
非聚集索引,也可以從生活中找到對映。非聚集索引強調的是邏輯分類。可以說是定義了一套儲存規則,而需要有一塊控制項來維護這個規則,這個被稱之為索引表。區別:繼續使用上述提到的例子:
對於這種方式來說,你需要兩個步驟:同學如果想去圖書館找一本書,而不知道這本書在**?那麼這個同學首先應該找的就是 檢索室吧。對於要查詢一本書來說,在檢索室查是乙個非常快捷的的途徑了吧。但是,在檢索室中你查到了該書在xx室xx書架的資訊。你的查詢結束了嗎?沒有吧。你僅僅找到了目的書的位置資訊,你還要去該位置去取書。
1、查詢該記錄所在的位置。
2、通過該位置去取要找的記錄。
聚集索引:可以幫助把很大的範圍,迅速減小範圍。但是查詢該記錄,就要從這個小範圍中scan了。非聚集索引:把乙個很大的範圍,轉換成乙個小的地圖。你需要在這個小地圖中找你要尋找的資訊的位置。然後通過這個位置,再去找你所需要的記錄。
全表掃瞄
在資料庫中,對無索引的表進行查詢一般稱為全表掃瞄。全表掃瞄是資料庫伺服器用來搜尋表的每一條記錄的過程,直到所有符合給定條件的記錄返回為止。
何時適用全表掃瞄編輯
- 單錶查詢
- 表很小,索引可能就比表還大。
- 訪問的資料佔全表資料的百分比很大,索引訪問的總成本大於全表掃瞄的成本。
- 相對於索引來說,表中的資料排列過於凌亂,表現出來就是索引的 clustering_factor 很大,導致索引的訪問成本劇增。
-
深入淺出資料庫索引原理
建立索引很簡單,但是能深入理解索引原理又能恰到好處使用索引又是另外一回事。為什麼要給表加上主鍵?我們平時建表的時候都會為表加上主鍵,在某些關聯式資料庫中,如果建表時不指定主鍵,資料庫會拒絕建表的語句執行。事實上,乙個加了主鍵的表,並不能被稱之為 表 乙個沒加主鍵的表,它的資料無序的放置在磁碟儲存器上...
深入淺出理解索引
一 深入淺出理解索引結構 實際上,您可以把索引理解為一種特殊的目錄。sql server提供了兩種索引 聚集索引 clustered index,也稱聚類索引 簇集索引 和非聚集索引 nonclustered index,也稱非聚類索引 非簇集索引 下面,我們舉例來說明一下聚集索引和非聚集索引的區別...
深入淺出理解索引
一 深入淺出理解索引結構 實際上,您可以把索引理解為一種特殊的目錄。sql server提供了兩種索引 聚集索引 clustered index,也稱聚類索引 簇集索引 和非聚集索引 nonclustered index,也稱非聚類索引 非簇集索引 下面,我們舉例來說明一下聚集索引和非聚集索引的區別...