歡迎使用CSDN markdown編輯器

2021-07-29 21:02:55 字數 2660 閱讀 2400

sql索引在資料庫優化中占有乙個非常大的比例, 乙個好的索引的設計,可以讓你的效率提高幾十甚至幾百倍,在這裡將帶你一步步揭開他的神秘面紗。

1.1 什麼是索引?

sql索引有兩種,聚集索引和非聚集索引,索引主要目的是提高了sql server系統的效能,加快資料的查詢速度與減少系統的響應時間

下面舉兩個簡單的例子:

圖書館的例子:乙個圖書館那麼多書,怎麼管理呢?建立乙個字母開頭的目錄,例如:a開頭的書,在第一排,b開頭的在第二排,這樣在找什麼書就好說了,這個就是乙個聚集索引,可是很多人借書找某某作者的,不知道書名怎麼辦?圖書管理員在寫乙個目錄,某某作者的書分別在第幾排,第幾排,這就是乙個非聚集索引

字典的例子:字典前面的目錄,可以按照拼音和部首去查詢,我們想查詢乙個字,只需要根據拼音或者部首去查詢,就可以快速的定位到這個漢字了,這個就是索引的好處,拼音查詢法就是聚集索引,部首查詢就是乙個非聚集索引.

看了上面的例子,下面的一句話大家就很容易理解了:聚集索引儲存記錄是物理上連續存在,而非聚集索引是邏輯上的連續,物理儲存並不連續。就像字段,聚集索引是連續的,a後面肯定是b,非聚集索引就不連續了,就像圖書館的某個作者的書,有可能在第1個貨架上和第10個貨架上。還有乙個小知識點就是:聚集索引乙個表只能有乙個,而非聚集索引乙個表可以存在多個。
1.2 索引的儲存機制

首先,無索引的表,查詢時,是按照順序存續的方法掃瞄每個記錄來查詢符合條件的記錄,這樣效率十分低下,舉個例子,如果我們將字典的漢字隨即打亂,沒有前面的按照拼音或者部首查詢,那麼我們想找乙個字,按照順序的方式去一頁頁的找,這樣效率有多底,大家可以想象。

聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致,其實理解起來非常簡單,還是舉字典的例子:如果按照拼音查詢,那麼都是從a-z的,是具有連續性的,a後面就是b,b後面就是c, 聚集索引就是這樣的,他是和表的物理排列順序是一樣的,例如有id為聚集索引,那麼1後面肯定是2,2後面肯定是3,所以說這樣的搜尋順序的就是聚集索引。非聚集索引就和按照部首查詢是一樣是,可能按照偏房查詢的時候,根據偏旁『弓』字旁,索引出兩個漢字,張和弘,但是這兩個其實乙個在100頁,乙個在1000頁,(這裡只是舉個例子),他們的索引順序和資料庫表的排列順序是不一樣的,這個樣的就是非聚集索引。

原理明白了,那他們是怎麼儲存的呢?在這裡簡單的說一下,聚集索引就是在資料庫被開闢乙個物理空間存放他的排列的值,例如1-100,所以當插入資料時,他會重新排列整個整個物理空間,而非聚集索引其實可以看作是乙個含有聚集索引的表,他只僅包含原表中非聚集索引的列和指向實際物理表的指標。他只記錄乙個指標,其實就有點和堆疊差不多的感覺了

1.3 什麼情況下設定索引

動作描述 使用聚集索引 使用非聚集索引

外來鍵列 應 應

主鍵列 應 應

列經常被分組排序(order by) 應 應

返回某範圍內的資料 應 不應

小數目的不同值 應 不應

大數目的不同值 不應 應

頻繁更新的列 不應 應

頻繁修改索引列 不應 應

乙個或極少不同值 不應 不應

建立索引的原則:

1) 定義主鍵的資料列一定要建立索引。

2) 定義有外來鍵的資料列一定要建立索引。

3) 對於經常查詢的資料列最好建立索引。

4) 對於需要在指定範圍內的快速或頻繁查詢的資料列;

5) 經常用在where子句中的資料列。

6) 經常出現在關鍵字order by、group by、distinct後面的字段,建立索引。如果建立的是復合索引,索引的字段順序要和這些關鍵字後面的字段順序一致,否則索引不會被使用。

7) 對於那些查詢中很少涉及的列,重複值比較多的列不要建立索引。

8) 對於定義為text、image和bit的資料型別的列不要建立索引。

9) 對於經常訪問的列避免建立索引

9) 限制表上的索引數目。對乙個存在大量更新操作的表,所建索引的數目一般不要超過3個,最多不要超過5個。索引雖說提高了訪問速度,但太多索引會影響資料的更新操作。

10) 對復合索引,按照欄位在查詢條件中出現的頻度建立索引。在復合索引中,記錄首先按照第乙個字段排序。對於在第乙個欄位上取值相同的記錄,系統再按照第二個欄位的取值排序,以此類推。因此只有復合索引的第乙個字段出現在查詢條件中,該索引才可能被使用,因此將應用頻度高的字段,放置在復合索引的前面,會使系統最大可能地使用此索引,發揮索引的作用。

1.4 如何建立索引

1.41 建立索引的語法:

create [unique][clustered | nonclustered] index index_name

on [with [index_property [,….n]]

說明:unique: 建立唯一索引。

clustered: 建立聚集索引。

nonclustered: 建立非聚集索引。

index_property: 索引屬性。

unique索引既可以採用聚集索引結構,也可以採用非聚集索引的結構,如果不指明採用的索引結構,則sql server系統預設為採用非聚集索引結構。

1.42 刪除索引語法:

drop index table_name.index_name[,table_name.index_name]

說明:table_name: 索引所在的表名稱。

index_name : 要刪除的索引名稱。

歡迎使用CSDN markdow

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...

歡迎毛毛與妞妞使用CSDN markdown編輯器

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...

歡迎使用CSDN markdow1n編輯器

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...