1.索引是什么
MySQL官方對(duì)索引的定義:索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。因此索引的本質(zhì)就是數(shù)據(jù)結(jié)構(gòu)。索引的目的在于提高查詢效率,可類比字典、書(shū)籍的目錄等這種形式。
可簡(jiǎn)單理解為“排好序的快速查找數(shù)據(jù)結(jié)構(gòu)”。在數(shù)據(jù)之外,數(shù)據(jù)庫(kù)系統(tǒng)還維護(hù)著滿足特定查找算法的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)以某種方式指向數(shù)據(jù),這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)上實(shí)現(xiàn)高級(jí)查找算法,這種數(shù)據(jù)結(jié)構(gòu)就是索引。
一般來(lái)說(shuō),索引本身也很大,不可能全部存儲(chǔ)在內(nèi)存中,因此索引往往以索引文件的形式存儲(chǔ)在磁盤(pán)上。
平常所說(shuō)的索引,如果沒(méi)有特別指明,都是B樹(shù)索引。其中聚集索引、次要索引、覆蓋索引、前綴索引、唯一索引默認(rèn)都是用B樹(shù)。
通過(guò)show index from tablename可以查看表的索引情況。
2.索引的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
①類似大學(xué)圖書(shū)館的書(shū)目索引,提高數(shù)據(jù)的檢索效率,降低數(shù)據(jù)庫(kù)的IO成本。
②通過(guò)索引列對(duì)數(shù)據(jù)進(jìn)行排序,降低數(shù)據(jù)的排序成本,從而降低CPU的消耗。
缺點(diǎn)
①索引實(shí)際上也是一張表,該表保存了主鍵與索引字段,并指向?qū)嶓w表的記錄,所以索引列也要占用空間。
②雖然索引大大提高了查詢效率,但是降低了更新表的速度,如insert、update和delete操作。因?yàn)楦卤頃r(shí),MySQL不僅要保存數(shù)據(jù),還要保存索引文件每次更新的索引列字段,并且在更新操作后,會(huì)更新相應(yīng)字段索引的信息。
③索引只是提高查詢效率的一個(gè)因素,如果你的MySQL有大量的數(shù)據(jù)表,就需要花時(shí)間研究建立最優(yōu)秀的索引或優(yōu)化查詢語(yǔ)句。
3.索引分類
索引主要分為以下三類:
①單值索引:一個(gè)索引只包含單個(gè)列,一個(gè)表可以有多個(gè)單值索引。
②唯一索引:索引列的值必須唯一,但允許有空值,主鍵就是唯一索引。
③復(fù)合索引:一個(gè)索引包含多個(gè)列
索引的結(jié)構(gòu):
①BTREE索引;②Hash索引;③Full-Text索引;④R-Tree索引。
4.建立索引與否的具體情況
①需建立索引的情況
1.主鍵自動(dòng)建立唯一索引。
2.頻繁作為查詢條件的字段。
3.查詢中與其他表關(guān)聯(lián)的字段,外鍵關(guān)系建立索引。
4.高并發(fā)下趨向創(chuàng)建組合索引。
5.查詢中排序的字段,排序字段若通過(guò)索引去訪問(wèn)將大大提高排序速度。
6.查詢中統(tǒng)計(jì)或分組字段。
②不需要?jiǎng)?chuàng)建索引的情況
1.表記錄太少。(數(shù)據(jù)量太少M(fèi)ySQL自己就可以搞定了)
2.經(jīng)常增刪改的表。
3.數(shù)據(jù)重復(fù)且平均分配的字段,如國(guó)籍、性別,不適合創(chuàng)建索引。
4.頻繁更新的字段不適合建立索引。
5.Where條件里用不到的字段不創(chuàng)建索引。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.