什麼是索引?
索引用來快速地尋找那些具有特定值的記錄,所有mysql索引都以b-樹的形式儲存。如果沒有索引,執行查詢時mysql必須從第乙個記錄開始掃瞄 整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜尋條件的列上已經建立了索引,mysql無需掃瞄任 何記錄即可迅速得到目標記錄所在的位置。如果表有1000個記錄,通過索引查詢記錄至少要比順序掃瞄記錄快100倍。
索引是對資料庫表中乙個或多個列(例如,employee表的姓氏(lname)列)的值進行排序的結構。如果想按特定職員的姓來查詢他或她,則與在表中搜尋所有的行相比,索引有助於更快地獲取資訊。
索引提供指標以指向儲存在表中指定列的資料值,然後根據指定的排序次序排列這些指標。資料庫使用索引的方式與使用書的目錄很相似:通過搜尋索引找到特定的值,然後跟隨指標到達包含該值的行。
在資料庫關係圖中,可以為選定的表建立、編輯或刪除索引/鍵屬性頁中的每個索引型別。當儲存附加在此索引上的表或包含此表的資料庫關係圖時,索引同時被儲存。有關詳細資訊,請參見建立索引。
通常情況下,只有當經常查詢索引列中的資料時,才需要在表上建立索引。索引將占用磁碟空間,並且降低新增、刪除和更新行的速度。不過在多數情況下, 索引所帶來的資料檢索速度的優勢大大超過它的不足之處。然而,如果應用程式非常頻繁地更新資料,或磁碟空間有限,那麼最好限制索引的數量。
索引型別
根據資料庫的功能,可在資料庫設計器中建立三種型別的索引——唯一索引、主鍵索引和聚集索引。
唯一索引:唯一索引不允許兩行具有相同的索引值。
主鍵索引:資料庫表通常有一列或列組合,其值用來唯一標識表中的每一行。該列稱為表的主鍵。
在資料庫關係圖中為表定義乙個主鍵將自動建立主鍵索引,主鍵索引是唯一索引的特殊型別。主鍵索引要求主鍵中的每個值是唯一的。
聚集索引:聚集索引中,表中各行的物理順序與鍵值的邏輯(索引)順序相同。表只能包含乙個聚集索引。
如果不是聚集索引,表中各行的物理順序與鍵值的邏輯順序不匹配。聚集索引比非聚集索引有更快的資料訪問速度
在microsoft?sqlserver?資料庫中可以建立聚集索引。在聚集索引中,表中各行的物理順序與索引鍵值的邏輯(索引)順序相同。表只 能包含乙個聚集索引。聚集索引通常可加快update和delete操作的速度,因為這兩個操作需要讀取大量的資料。建立或修改聚集索引可能要花很長時 間,因為執行這兩個操作時要在磁碟上對錶的行進行重組。
可考慮將聚集索引用於:
1:包含數量有限的唯一值的列,如state列只包含50個唯一的州**。
2:使用下列運算子返回乙個範圍值的查詢:between、>、>=、《和<=。
3:返回大結果集的查詢。(摘自microsoft?sqlserver?幫助)
聚集索引對於那些經常要搜尋範圍值的列特別有效。使用聚集索引找到包含第乙個值的行後,便可以確保包含後續索引值的行在物理相鄰。例如,如果應用程 序執行的乙個查詢經常檢索某一日期範圍內的記錄,則使用聚集索引可以迅速找到包含開始日期的行,然後檢索表中所有相鄰的行,直到到達結束日期。這樣有助於 提高此類查詢的效能。同樣,如果對從表中檢索的資料進行排序時經常要用到某一列,則可以將該錶在該列上聚集(物理排序),避免每次查詢該列時都進行排序, 從而節省成本。
當索引值唯一時,使用聚集索引查詢特定的行也很有效率。例如,使用唯一雇員id列emp_id查詢特定雇員的最快速的方法,是在emp_id列上建立聚集索引或primarykey約束。
在建立聚集索引之前,應先了解您的資料是如何被訪問的。可考慮將聚集索引用於:
1包含大量非重複值的列。
2使用下列運算子返回乙個範圍值的查詢:between、>、>=、《和<=。
3被連續訪問的列。
4返回大型結果集的查詢。
5經常被使用聯接或groupby子句的查詢訪問的列;一般來說,這些是外來鍵列。對orderby或groupby子句中指定的列進行索引,可以使sqlserver不必對資料進行排序,因為這些行已經排序。這樣可以提高查詢效能。
6oltp型別的應用程式,這些程式要求進行非常快速的單行查詢(一般通過主鍵)。應在主鍵上建立聚集索引。
聚集索引不適用於:
1頻繁更改的列這將導致整行移動(因為sqlserver必須按物理順序保留行中的資料值)。這一點要特別注意,因為在大資料量事務處理系統中資料是易失的。
2寬鍵來自聚集索引的鍵值由所有非聚集索引作為查詢鍵使用,因此儲存在每個非聚集索引的葉條目內。
說明:如果該錶上尚未建立聚集索引,且在建立primarykey約束時未指定非聚集索引,primarykey約束會自動建立聚集索引。
注意事項:定義聚集索引鍵時使用的列越少越好,這一點很重要。如果定義了乙個大型的聚集索引鍵,則同乙個表上定義的任何非聚集索引都將增大許多,因為非聚集索引條目包含聚集鍵。當把sql指令碼儲存到可用空間不足的磁碟上時,索引優化嚮導不返回錯誤。
索引的缺點
到目前為止,我們討論的都是索引的優點。事實上,索引也是有缺點的。
第二,對於需要寫入資料的操作,比如delete、update以及insert操作,索引會降低它們的速度。這是因為mysql不僅要把改動資料寫入資料檔案,而且它還要把這些改動寫入索引檔案。
什麼是資料庫索引,索引有什麼作用
資料庫索引是為了增加查詢速度而對表字段附加的一種標識。見過很多人機械的理解索引的概念,認為增加索引只有好處沒有壞處。這裡想把之前的索引學習筆記總結一下:
首先明白為什麼索引會增加速度,db在執行一條sql語句的時候,預設的方式是根據搜尋條件進行全表掃瞄,遇到匹配條件的就加入搜尋結果集合。如果我們對某一欄位增加索引,查詢時就會先去索引列表中一次定位到特定值的行數,大大減少遍歷匹配的行數,所以能明顯增加查詢的速度。那麼在任何時候都應該加索引麼?這裡有幾個反例:1、如果每次都需要取到所有表記錄,無論如何都必須進行全表掃瞄了,那麼是否加索引也沒有意義了。2、對非唯一的字段,例如「性別」這種大量重複值的字段,增加索引也沒有什麼意義。3、對於記錄比較少的表,增加索引不會帶來速度的優化反而浪費了儲存空間,因為索引是需要儲存空間的,而且有個致命缺點是對於update/insert/delete的每次執行,欄位的索引都必須重新計算更新。
那麼在什麼時候適合加上索引呢?我們看乙個mysql手冊中舉的例子,這裡有一條sql語句:
select c.companyid, c.companyname from companies c, user u where c.companyid = u.fk_companyid and c.numemployees >= 0 and c.companyname like '%i%' and u.groupid in (select g.groupid from groups g where g.grouplabel = 'executive')
這條語句涉及3個表的聯接,並且包括了許多搜尋條件比如大小比較,like匹配等。在沒有索引的情況下mysql需要執行的掃瞄行數是77721876行。而我們通過在companyid和grouplabel兩個欄位上加上索引之後,掃瞄的行數隻需要134行。在mysql中可以通過explain select來檢視掃瞄次數。可以看出來在這種聯表和複雜搜尋條件的情況下,索引帶來的效能提公升遠比它所佔據的磁碟空間要重要得多。
那麼索引是如何實現的呢?大多數db廠商實現索引都是基於一種資料結構——b樹。因為b樹的特點就是適合在磁碟等直接儲存裝置上組織動態查詢表。b樹的定義是這樣的:一棵m(m>=3)階的b樹是滿足下列條件的m叉樹:
1、每個結點包括如下作用域(j, p0, k1, p1, k2, p2, ... ki, pi) 其中j是關鍵字個數,p是孩子指標
2、所有葉子結點在同一層上,層數等於樹高h
3、每個非根結點包含的關鍵字個數滿足[m/2-1]<=j<=m-1
4、若樹非空,則根至少有1個關鍵字,若根非葉子,則至少有2棵子樹,至多有m棵子樹
看乙個b樹的例子,針對26個英文本母的b樹可以這樣構造:
資料庫索引的作用以及優缺點分析
為什麼要建立索引呢?這是因為,建立索引可以大大提高系統的效能。第一,通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。第二,可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。第三,可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。第四,在使用分組和排序子句進行資料...
關於索引的作用以及建立方法
為什麼要建立索引呢?這是因為,建立索引可以大大提高系統的效能。第一,通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。第二,可以大大加快 資料的檢索速度,這也是建立索引的最主要的原因。第三,可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。建立方法分為兩種 分別是語句建立...
建立資料庫 表以及索引
這樣做就可以建立乙個資料庫 create database 資料庫名稱這樣做就可以建立乙個資料庫中的表 create table 表名稱 列名稱1 資料型別,列名稱2 資料型別,本例演示如何建立名為 person 的表,有四個列。列名是 lastname firstname address 以及 a...