1)什么是索引:
索引是幫助mysql高效獲取數(shù)據(jù)的數(shù)據(jù)結構棚贾,
索引的本質就是數(shù)據(jù)結構真慢。
結論:數(shù)據(jù)本身之外服爷,數(shù)據(jù)庫還維護著一個滿足特定查找算法的數(shù)據(jù)結構药薯,這些數(shù)據(jù)結構以某種方式指向數(shù)據(jù),這樣就可以在這些數(shù)據(jù)結構的基礎上實現(xiàn)高級查找算法狂丝,這種數(shù)據(jù)結構就是索引换淆。
一般來說,索引本身也很大几颜,不可能全部儲存在內存中倍试,因此,索引往往以索引文件的形式儲存在磁盤上蛋哭。
2)索引的優(yōu)勢和劣勢:
優(yōu)勢:
提高數(shù)據(jù)檢索的效率县习,降低了數(shù)據(jù)庫OI成本。
通過索引列對數(shù)據(jù)進行排序,降低數(shù)據(jù)排序成本躁愿,降低了CPU的消耗叛本。
劣勢:
實際上索引也是一張表,該表保存了主鍵與索引字段彤钟,并指向實體表的記錄所以索引列也是要占內存空間的来候。
雖然索引大大的提高了查詢的速度,同時也會降低更新表的速度样勃,對表進行insert吠勘、update性芬、delete峡眶。因為更新表時,mysql不僅要保 存數(shù)據(jù)植锉,還要保存一下索引文件每次更新添加了索引列的字段辫樱,都會調整因為更新帶來的鍵值變化后的索引信息。
索引只是提高效率的一個因素俊庇,如果你的mysql有大數(shù)據(jù)量的表狮暑,就需要花時間研究建立最優(yōu)秀的索引,或優(yōu)化查詢辉饱。
3)索引的類型:
單值索引:即一個索引只包含單個列,一個表可以有多個單列索引彭沼。
唯一索引:索引列的值必須唯一缔逛,但允許空值。
復合索引:即一個索引包含了多個列姓惑。
- 基本語法:
ALTER TABLE tb1_name ADD PRIMARY KEY(column_list);//該語句添加一個主鍵索引褐奴,這意味著索引值必須是唯一的,且不能為null于毙。
ALTER TABLE tb1_name ADD UNIQUE 'index_name' (column_list);//該語句添加的是唯一索引敦冬,該索引的值必須是唯一的(除了NULL外,NULL可能會出現(xiàn)很多次)
ALTER TABLE tb1_name ADD INDEX 'index_name' (column_list);//該語句添加普通索引唯沮,索引值可出現(xiàn)多次
ALTER TABLE tb1_name ADD INDEX 'idx_column_list1_column_list2' (`column_list1`, `column_list2`);//該語句添加復合索引
5)mysql索引結構:
常見的MySQL索引有 :BTree索引:Hash索引:full-text全文索引:R-Tree索引:
主要的是:BTree索引
6)那些情況下需要建立索引:
1脖旱、主鍵自動建立唯一索引。
2介蛉、頻繁作為查詢條件的字段應該創(chuàng)建索引萌庆。
3、查詢中與其他表關聯(lián)的字段甘耿,外鍵關系建立索引踊兜。
4、頻繁更新的字段不適合創(chuàng)建索引(因為每次更新不單單更新了記錄還會更新索引文件)佳恬。
5捏境、where條件里用不到的字段不用創(chuàng)建索引于游。
6、單鍵/組合索引選擇的問題垫言?(在高并發(fā)下偏向創(chuàng)建組合索引)贰剥。
7、查詢中排序的字段筷频,排序字段若通過索引去訪問將大大提高排序速度蚌成。
8、查詢中統(tǒng)計或分組字段凛捏。
7)那些情況下不需要建立索引:
1担忧、表記錄太少。
2坯癣、經常增刪改的表瓶盛。
原因:索引雖然提高了查詢的速度,同事缺會降低更新表的速度示罗,如對表進行INSERT惩猫、UPDATE、DELETE蚜点、MySQL不僅要保存轧房、修改、刪除數(shù)據(jù)绍绘,還要保存奶镶、更新、刪除索引文件脯倒。
3实辑、對數(shù)據(jù)重復且分布平均的表字段不應該建立索引,應該只為最經常查詢和最近常排序的數(shù)據(jù)列建立索引藻丢。
8)覆蓋索引:
理解方式一(推薦):
就是select的數(shù)據(jù)列只用從索引中就能獲取的悠反,不必讀取數(shù)據(jù)行残黑,MySql可以利用索引返回select列表中的字段,而不必更具索引在此讀取數(shù)據(jù)文件斋否。換句話說梨水,查詢列要被所建的索引覆蓋。
理解方式二:
索引是高效找到行的一個方法茵臭,但是數(shù)據(jù)庫一般也能使用索引找到一個列的數(shù)據(jù)疫诽,因此他不必讀取整個行,畢竟索引葉子節(jié)點儲存了他們索引的數(shù)據(jù),當能通過讀取索引就能獲取想要的數(shù) 據(jù)奇徒,那就不需要在讀取行了雏亚,一個索引包含了(或覆蓋了)滿足查詢結果的數(shù)據(jù),就叫覆蓋索引摩钙。
注意:
如果要數(shù)用覆蓋索引罢低,一定要注意select列表中只取出需要的列,不可select *胖笛。
因為如果要將所用字段一起做索引网持,會導致索引文件過大,查詢的性能下降长踊。