大家好,我是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