1)概念:算法
1)數據庫管理系統中,除了數據以外,數據庫還維護着知足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這種數據結構就是索引。 2)索引是創建在數據庫表的某些列上。
2)實現:數據庫
一般使用B樹及其變種B+樹來實現索引。
3)優勢:服務器
1)能夠大大加快數據的查詢速度。 2)在使用分組和排序子句查詢數據時,能夠顯著減小查詢中分組和排序的時間。 3)能夠加速表和表之間的鏈接。eg:在實現數據的參考完整性(使用外鍵)時,可加快鏈接的速度。 4)經過建立惟一性索引,能夠保證表中每一行數據的惟一性 加快查詢速度的緣由: 索引大大下降了服務器須要掃描的數據量。 索引能夠幫助服務器避免排序和使用臨時表。 代價: 1)增長了數據庫的存儲空間。 2)在修改、插入和刪除數據時,索引也要動態維護,故在增刪改數據時會花費較多的時間。
4)分類:數據結構
在建立索引時,必需要肯定要建立的索引列和索引類型。 1)普通索引: 2)惟一索引:全部行的索引值均不相同。 3)主鍵索引: 1>定義主鍵時數據庫會自動建立主鍵索引,主鍵索引是惟一索引的特定類型。 2>主鍵索引要求主鍵中的每一個值都惟一。 4)彙集索引: 1>在彙集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。 2>一個表只能包含一個彙集索引,由於一個表的物理順序只有一種狀況。 3>若是某索引不是彙集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。 4>與非彙集索引相比,彙集索引一般提供更快的數據訪問速度。 應用: 1>使用BETWEEN、>、>=、<、<= 等操做符返回一個範圍值的列。 2>被連續訪問的列。 3>返回大型結果集的查詢。 4>常用GROUP BY子句查詢的列。 5)全文索引: 全文索引是一種特殊類型的索引,它查找的是文本中的關鍵詞,而不是直接比較索引中的值,全文索引不是簡單的where條件匹配,它更相似於搜索引擎作的事情。 在相同的列上同時建立全文索引和基於值的B-tree索引不會有衝突,全文索引只適用於MATCH AGAINST 操做,而不適用於普通的where條件。 6)複合索引: 概念: 在多個列上創建的索引稱爲複合索引。 說明: 1>最左原則: 索引文件具備B-Tree的最左匹配特性:若是沒有從複合索引的最左列開始(依次)查找,則沒法使用索引,故創建複合索引時要特別注意多個列直接的順序。 2>在執行查詢語句時,MySQL只能使用一個索引。 3>若是一個單列索引和一個複合索引都包含某一列,則MySQL會從這兩個索引中選擇一個限制最嚴格(得到結果集記錄數最少)的索引來使用。 4>創建一個複合索引index_uid_name_age (bu_id, name, age) 至關於 創建了這3個索引:index_uid (bu_id)、index_uid_name (bu_id, name)、index_uid_name_age (bu_id, name, age) 5>左模糊查詢(like %str)和全模糊查詢(like %str%)沒法使用該列上的索引。
5)建立索引的場景:性能
1)須要常常查詢的列上。 2)在做爲主鍵的列上,強制該列的惟一性。 3)鏈接表的列上(eg:外鍵),能夠加快鏈接的速度。 4)在常常須要排序(或根據範圍進行查詢)的列上建立索引,由於索引已經排序,這樣查詢能夠利用索引的排序,加快排序查詢時間。 5)在常用在WHERE子句中的列上建立索引,加快條件的判斷速度。
6)不適合建立索引的場景:ui
1)在查詢中不多使用到的列不該該建立索引。 2)取值不多的列不該該建立索引。eg:人員表中的性別列。 說明:查詢時須要在表中搜索的數據行佔全部數據行的比例很大,故增長索引不能顯著提升查詢速度。 3)text、image和bit數據類型的列不該該建立索引。 說明:這些列的數據量要麼至關大,要麼取值不多。 4)當修改性能遠遠大於檢索性能時,不該該建立索引。 說明:當增長索引時,會提升檢索性能,可是會下降修改性能。
7)MySQL中key和index的區別:搜索引擎
1)key有兩個做用:約束的做用和索引的做用。 2)index:沒有約束的做用,只有一個索引的做用。 3)key的約束做用舉例: primary key 惟一性約束 unique key 惟一性約束 foreign key 完整性約束