唯一索引和普通索引的區(qū)別

大家好,我是IT修真院深圳分院第5期學(xué)員,一枚正直善良的JAVA程序員。

今天給大家分享一下,修真院官網(wǎng)JAVA任務(wù)1中,唯一索引和普通索引的區(qū)別。

一、背景介紹

索引用來快速地尋找那些具有特定值的記錄,如果沒有索引,執(zhí)行查詢時(shí)Mysql必須從第一個(gè)記錄開始掃描整個(gè)表的所有記錄,直至找到符合要求的記錄,表里面的記錄數(shù)量越多,這個(gè)操作的代價(jià)就越高,如果作為搜索條件的列上已經(jīng)創(chuàng)建了索引,mysql無需掃描任何記錄即可迅速得到目標(biāo)記錄所在的位置。如果表有一千個(gè)記錄,通過索引查找記錄至少要比順序掃描記錄快100倍。所以對(duì)于現(xiàn)在的各種大型數(shù)據(jù)庫來說,索引可以大大提高數(shù)據(jù)庫的性能,以至于它變成了數(shù)據(jù)庫不可缺少的一部分。


二.知識(shí)剖析

1.MySQL都有哪些索引類型呢?

mysql提供多種索引類型供選擇:普通索引,唯一索引,主鍵

全文索引,單列索引,與多列索引

2.普通索引

普通索引的唯一任務(wù)是加快對(duì)數(shù)據(jù)的訪問速度,因此,應(yīng)該只為那些最經(jīng)常出現(xiàn)在查詢條件(WHERE column=)或者排序條件(ORDERBY column)中的數(shù)據(jù)列創(chuàng)建索引

3.主鍵

必須為主鍵字段創(chuàng)建一個(gè)索引,這個(gè)Mysql索引就是所謂的“主索引”。主索引與唯一索引的唯一區(qū)別是:前者在定義時(shí)使用的關(guān)鍵字是PRIMARY而不是UNIQUE

4.唯一性索引

如果確定某個(gè)數(shù)據(jù)列只包含彼此各不相同的值,在為這個(gè)數(shù)據(jù)列創(chuàng)建索引的時(shí)候,就應(yīng)該用關(guān)鍵字UNIQUE把它定義為一個(gè)唯一索引,Mysql會(huì)在有新紀(jì)錄插入數(shù)據(jù)表時(shí),自動(dòng)檢查新紀(jì)錄的這個(gè)字段的值是否已經(jīng)在某個(gè)記錄的這個(gè)字段里出現(xiàn)過了。如果是,mysql將拒絕插入那條新紀(jì)錄。也就是說,唯一索引可以保證數(shù)據(jù)記錄的唯一性。事實(shí)上,在許多場(chǎng)合,人們創(chuàng)建唯一索引的目的往往不是為了提高訪問速度,而只是為了避免數(shù)據(jù)出現(xiàn)重復(fù)

5.索引的優(yōu)點(diǎn)

5.1.可以通過建立唯一索引或者主鍵索引,保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性

5.2.建立索引可以大大提高檢索的數(shù)據(jù),以及減少表的檢索行數(shù)

5.3.在表連接的連接條件,可以加速表與表直接的相連

5.4.在分組和排序字句進(jìn)行數(shù)據(jù)檢索,可以減少查詢時(shí)間中分組和排序時(shí)所消耗的時(shí)間(數(shù)據(jù)庫的記錄會(huì)重新排序)

5.5.建立索引,在查詢中使用索引,可以提高性能。

6.索引的缺點(diǎn)

6.1.創(chuàng)建索引和維護(hù)索引,會(huì)耗費(fèi)時(shí)間,隨著數(shù)據(jù)量的增加而增加

6.2.索引文件會(huì)占用物理空間,除了數(shù)據(jù)表需要占用物理空間之外,每一個(gè)索引還會(huì)占用一定的物理空間

6.3.當(dāng)對(duì)表的數(shù)據(jù)進(jìn)行INSERT,UPDATE,DELETE的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),這樣就會(huì)降低數(shù)據(jù)的維護(hù)速度,(建立索引會(huì)占用磁盤空間的索引文件)。



三.常見問題

1.如何創(chuàng)建索引

2.隱式類型轉(zhuǎn)換對(duì)MySQL選擇索引的影響。

3.什么情況下建索引。

4.什么情況不建索引。

5.索引對(duì)查詢提高多少性能?

四.解決方案

1.SQL插入索引語句。

1.1普通索引:ALTER TABLE'table-name' ADD INDEX index_name('column')

1.2唯一索引:ALTER TABLE'table-name' ADD UNIQUE('column')

1.3主鍵索引:ALTER TABLE'table-name' ADD PRIMARY KEY ('column')

2.當(dāng)文本字段與數(shù)字進(jìn)行比較時(shí),由于類型不同,MySQL需要做隱式類型轉(zhuǎn)換才能進(jìn)行比較。

默認(rèn)轉(zhuǎn)換規(guī)則是:不同類型全都轉(zhuǎn)換為浮點(diǎn)型m,如果字段是字符,條件是整型,那么會(huì)把表中字段全都轉(zhuǎn)換成整型

3.1.在經(jīng)常需要搜索的列上,可以加快索引的速度

3.2主鍵列上可以確保列的唯一性(手機(jī)號(hào),身份證號(hào),銀行卡號(hào))。

3.3在表與表的而連接條件上,加上索引,可以加快連接查詢的速度。

3.4.在經(jīng)常需要排序(order by)分組(group by)和distinct列上加索引可以加快排序查詢的時(shí)間,(單獨(dú)order by用不了索引,索引考慮加where或者加limit)

3.5.盡量選擇區(qū)分度高的列作為索引。

3.6.索引列不能參與計(jì)算,保持列“干凈”。

3.7.盡量的擴(kuò)展索引,不要新建索引。

4.1.查詢中很少使用到的列,不應(yīng)該創(chuàng)建索引,如果建立了索引然而還會(huì)降低mysql的性能和增大了空間需求。。

4.2很少數(shù)據(jù)的列也不應(yīng)該建立索引,比如一個(gè)性別字段0或者1,在查詢中,結(jié)果集的數(shù)據(jù)占了表中數(shù)據(jù)行的比例比較大,mysql需要掃描的行數(shù)很多,增加索引,并不能提高效率。

4.3定義為text和image和bit數(shù)據(jù)類型的列不應(yīng)該增加索引。

4.4.當(dāng)表的修改(UPDATE,INSERT,DELETE)操作遠(yuǎn)遠(yuǎn)大于檢索(SELECT)操作時(shí)不應(yīng)該創(chuàng)建索引,這兩個(gè)操作時(shí)互斥的關(guān)系。

5.見運(yùn)行編碼效果

五。編碼實(shí)戰(zhàn)

七、參考文獻(xiàn)

百度,書籍

八.更多討論

1.MySQL索引方法有幾種?

答:MySQL目前主要有以下幾種索引方法:B-Tree,Hash,R-Tree。

2.B-Tree和Hash的區(qū)別是什么?

答: 1、B-Tree

B-Tree是最常見的索引類型,所有值(被索引的列)都是排過序的,每個(gè)葉節(jié)點(diǎn)到跟節(jié)點(diǎn)距離相等。所以B-Tree適合用來查找某一范圍內(nèi)的數(shù)據(jù),而且可以直接支持?jǐn)?shù)據(jù)排序(ORDER BY)

B-Tree在MyISAM里的形式和Innodb稍有不同:

MyISAM表數(shù)據(jù)文件和索引文件是分離的,索引文件僅保存數(shù)據(jù)記錄的磁盤地址

InnoDB表數(shù)據(jù)文件本身就是主索引,葉節(jié)點(diǎn)data域保存了完整的數(shù)據(jù)記錄

2、Hash索引

2.1.僅支持"=","IN"和"<=>"精確查詢,不能使用范圍查詢:

由于Hash索引比較的是進(jìn)行Hash運(yùn)算之后的Hash值,所以它只能用于等值的過濾,不能用于基于范圍的過濾,因?yàn)榻?jīng)過相應(yīng)的Hash算法處理之后的Hash

2.2.不支持排序:

由于Hash索引中存放的是經(jīng)過Hash計(jì)算之后的Hash值,而且Hash值的大小關(guān)系并不一定和Hash運(yùn)算前的鍵值完全一樣,所以數(shù)據(jù)庫無法利用索引的數(shù)據(jù)來避免任何排序運(yùn)算

2.3.在任何時(shí)候都不能避免表掃描:

由于Hash索引比較的是進(jìn)行Hash運(yùn)算之后的Hash值,所以即使取滿足某個(gè)Hash鍵值的數(shù)據(jù)的記錄條數(shù),也無法從Hash索引中直接完成查詢,還是要通過訪問表中的實(shí)際數(shù)據(jù)進(jìn)行相應(yīng)的比較,并得到相應(yīng)的結(jié)果

2.4.檢索效率高,索引的檢索可以一次定位,不像B-Tree索引需要從根節(jié)點(diǎn)到枝節(jié)點(diǎn),最后才能訪問到頁節(jié)點(diǎn)這樣多次的IO訪問,所以Hash索引的查詢效率要遠(yuǎn)高于B-Tree索引

2.5.只有Memory引擎支持顯式的Hash索引,但是它的Hash是nonunique的,沖突太多時(shí)也會(huì)影響查找性能。Memory引擎默認(rèn)的索引類型即是Hash索引,雖然它也支持B-Tree索引

3.為什么索引類型不一樣,但不同類型的索引方式還是B-Tree和Hash呢?

百度找不到答案,師兄們也不知道,咋整?暫時(shí)存疑。

4.不通過SQL語句,在java里面怎么創(chuàng)建索引?

用兩個(gè)Map搞定

Map wenjname=new HashMap();///索引是數(shù)字,內(nèi)容是文件名

Map dcjc=new HashMap();///索引是單詞,內(nèi)容是上面的索引

一個(gè)Map的話,也可以但是我覺得很費(fèi)資源啊

騰訊視頻

感謝大家觀看

今天的分享就到這里啦,歡迎大家點(diǎn)贊、轉(zhuǎn)發(fā)、留言、拍磚~

技能樹.IT修真院

“我們相信人人都可以成為一個(gè)工程師,現(xiàn)在開始,找個(gè)師兄,帶你入門,掌控自己學(xué)習(xí)的節(jié)奏,學(xué)習(xí)的路上不再迷?!?。

這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學(xué)習(xí)路線,學(xué)習(xí)透明化,成長(zhǎng)可見化,師兄1對(duì)1免費(fèi)指導(dǎo)??靵砼c我一起學(xué)習(xí)吧~

我的邀請(qǐng)碼:19214843,

或者你可以直接點(diǎn)擊此鏈接:http://www.jnshu.com/login/1/19214843

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容