数据库-索引
索引
索引是對(duì)數(shù)據(jù)庫表中一個(gè)或多個(gè)列(例如,employee 表的姓名 (name) 列)的值進(jìn)行排序的結(jié)構(gòu),使用索引可快速訪問數(shù)據(jù)庫表中的特定信息。索引的一個(gè)主要目的就是加快檢索表中數(shù)據(jù)的方法,亦即能協(xié)助信息搜索者盡快的找到符合限制條件的記錄ID的輔助數(shù)據(jù)結(jié)構(gòu)。從數(shù)據(jù)搜索實(shí)現(xiàn)的角度來看,索引也是另外一類文件/記錄,它包含著可以指示出相關(guān)數(shù)據(jù)記錄的各種記錄。其中,每一索引都有一個(gè)相對(duì)應(yīng)的搜索碼,字符段的任意一個(gè)子集都能夠形成一個(gè)搜索碼。這樣,索引就相當(dāng)于所有數(shù)據(jù)目錄項(xiàng)的一個(gè)集合,它能為既定的搜索碼值的所有數(shù)據(jù)目錄項(xiàng)提供定位所需的各種有效支持。
索引分為聚簇索引和非聚簇索引兩種,聚簇索引 是按照數(shù)據(jù)存放的物理位置為順序的,而非聚簇索引就不一樣了;聚簇索引能提高多行檢索的速度,而非聚簇索引對(duì)于單行的檢索很快。根據(jù)數(shù)據(jù)庫的功能,可以在數(shù)據(jù)庫中創(chuàng)建三種索引:唯一索引、主鍵索引和聚集索引。
唯一索引 唯一索引是不允許其中任何兩行具有相同索引值的索引。當(dāng)現(xiàn)有數(shù)據(jù)中存在重復(fù)的鍵值時(shí),大多數(shù)數(shù)據(jù)庫不允許將新創(chuàng)建的唯一索引與表一起保存。數(shù)據(jù)庫還可能防止添加將在表中創(chuàng)建重復(fù)鍵值的新數(shù)據(jù)。例如,如果在employee表中職員的姓(lname)上創(chuàng)建了唯一索引,則任何兩個(gè)員工都不能同姓。 主鍵索引 數(shù)據(jù)庫表經(jīng)常有一列或多列組合,其值唯一標(biāo)識(shí)表中的每一行。該列稱為表的主鍵。在數(shù)據(jù)庫關(guān)系圖中為表定義主鍵將自動(dòng)創(chuàng)建主鍵索引,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個(gè)值都唯一。當(dāng)在查詢中使用主鍵索引時(shí),它還允許對(duì)數(shù)據(jù)的快速訪問。 聚集索引在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個(gè)表只能包含一個(gè)聚集索引。如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的數(shù)據(jù)訪問速度。聚集索引和非聚集索引的區(qū)別,如字典默認(rèn)按字母順序排序,讀者如知道某個(gè)字的讀音可根據(jù)字母順序快速定位。因此聚集索引和表的內(nèi)容是在一起的。如讀者需查詢某個(gè)生僻字,則需按字典前面的索引,舉例按偏旁進(jìn)行定位,找到該字對(duì)應(yīng)的頁數(shù),再打開對(duì)應(yīng)頁數(shù)找到該字。這種通過兩個(gè)地方而查詢到某個(gè)字的方式就如非聚集索引。
具體使用場(chǎng)景:
1.?建立索引的目的就是幫助查詢,如果查尋用不到則索引就沒有必要建立。
2.?如果表是經(jīng)常需要更新的也不適合做索引 。頻繁更新會(huì)導(dǎo)致索引也會(huì)頻繁更新,降低寫的效率。
3.?唯一性差的字段不適合創(chuàng)建索引。
4.?當(dāng)給一個(gè)字段創(chuàng)建了索引的話,而這個(gè)字段要進(jìn)行l(wèi)ike模糊查詢的話,那么這個(gè)值左邊不可以有%,因?yàn)樗饕樵兪且獜淖蟮接业?#xff0c;你如果給它加上%后,左邊的值不是確定的話,它會(huì)找不到這個(gè)索引。所以在使用like模糊查詢的時(shí)候,值得左邊不可以有%。
5. order by ?不會(huì)使用索引
6. or?當(dāng)前后2個(gè)字段都有索引時(shí)才可以索引出來 否則不可以。
7.?如果數(shù)據(jù)表過大(5w以上)則有些字段(字符型長(zhǎng)度超過(40))不適合作為索引。查詢大量數(shù)據(jù)時(shí),索引有效,但是慢
8.?不使用索引的原因:因?yàn)樗饕龝r(shí)會(huì)先過一遍索引在過一遍數(shù)據(jù)
9.?當(dāng)數(shù)據(jù)多且字段值有相同的值得時(shí)候用普通索引。
10.?當(dāng)字段多且字段值沒有重復(fù)的時(shí)候用唯一索引。
11.?當(dāng)有多個(gè)字段名都經(jīng)常被查詢的話用復(fù)合索引。
12.?普通索引不支持空值,唯一索引支持空值。
13.?若是表增刪改多而查詢較少的話,就不要?jiǎng)?chuàng)建索引了,因?yàn)槿绻憬o一列創(chuàng)建了索引,那么對(duì)該列進(jìn)行增刪改的時(shí)候,都會(huì)先訪問這一列的索引,若是增,則在這一列的索引內(nèi)以新填入的這個(gè)字段名的值為名創(chuàng)建索引的子集,?若是改,則會(huì)把原來的刪掉,再添入一個(gè)以這個(gè)字段名的新值為名創(chuàng)建索引的子集,?若是刪,則會(huì)把索引中以這個(gè)字段為名的索引的子集刪掉。所以,會(huì)對(duì)增刪改的執(zhí)行減緩速度,
14.?更新太頻繁地字段不適合創(chuàng)建索引。
15.?不會(huì)出現(xiàn)在where條件中的字段不該建立索引。
轉(zhuǎn)載于:https://www.cnblogs.com/fqfanqi/p/6986942.html
總結(jié)
- 上一篇: 自己做的一个固定大小对象内存池,效率大概
- 下一篇: 数据库优化相关