索引

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		完整性約束
相關文章
相關標籤/搜索