mysql 添加唯一索引_浅谈Mysql索引
文章原創(chuàng)于公眾號:程序猿周先森。本平臺不定時更新,喜歡我的文章,歡迎關(guān)注我的微信公眾號。
我們都知道,數(shù)據(jù)庫索引可以幫助我們更加快速的找出符合的數(shù)據(jù),但是如果不使用索引,Mysql則會從第一條開始查詢,直到查詢到符合的數(shù)據(jù),這樣也會導(dǎo)致一個問題:如果沒有添加索引,表中數(shù)據(jù)很大則查詢數(shù)據(jù)花費(fèi)的時間更多。而這時候我們?yōu)樽侄翁砑右粋€索引,Mysql就會快速搜索數(shù)據(jù),可以節(jié)省大量時間。MyISAM和InnoDB是最經(jīng)常使用的兩個存儲引擎,MyISAM和InnoDB索引都是采用B+樹的數(shù)據(jù)結(jié)構(gòu),那B樹和B+樹的區(qū)別是什么呢?
B樹B樹是一種多路搜索樹,搜索時從根節(jié)點(diǎn)開始,對節(jié)點(diǎn)內(nèi)的有序關(guān)鍵字進(jìn)行二分查找,如果命中則結(jié)束搜索,否則根據(jù)搜索大小結(jié)果進(jìn)入左右子節(jié)點(diǎn)重復(fù)搜索,直到找到搜索結(jié)果。
特點(diǎn):
- 關(guān)鍵字分布在B樹所有節(jié)點(diǎn)。
- 關(guān)鍵字不會重復(fù)出現(xiàn)在多個節(jié)點(diǎn)。
- 搜索可能在非葉子節(jié)點(diǎn)就結(jié)束。
B+樹
B+樹實(shí)際上是一種特殊的B樹,和B樹感官最明顯的一個不同點(diǎn)在于B+樹關(guān)鍵字只會出現(xiàn)在葉子結(jié)點(diǎn)中,并且關(guān)鍵字在鏈表中是有序的,也就是B+樹的搜索最后只會在葉子結(jié)點(diǎn)中命中結(jié)果,那非葉子結(jié)點(diǎn)在B+樹充當(dāng)什么角色呢?非葉子節(jié)點(diǎn)在B+樹中相當(dāng)于是葉子結(jié)點(diǎn)的索引,而葉子結(jié)點(diǎn)是存儲關(guān)鍵字?jǐn)?shù)據(jù)的數(shù)據(jù)層。既然Mysql索引采用B+樹的數(shù)據(jù)結(jié)構(gòu),那么相比于B樹,B+樹做索引的優(yōu)勢在哪里呢:
- 磁盤讀寫代價更低。
- 查詢效率更穩(wěn)定。
- 遍歷元素效率高。
講完了B樹和B+樹的概念,接下來就需要開始談?wù)勊饕恕F鋵?shí)Mysql索引的數(shù)據(jù)結(jié)構(gòu)有兩種:B+樹、Hash。但是在MyISAM和InnoDB存儲引擎當(dāng)中只能使用B+樹,索引其實(shí)總共可以分為四類:
- 單列索引:單列索引有三種,包括普通索引、唯一索引、主鍵索引
- 組合索引
- 全文索引
- 空間索引
單列索引
單列索引,顧名思義就是一個索引只能作用于單列,但是一個數(shù)據(jù)表可以同時擁有多個單列索引。單列索引一共有三種:普通索引、唯一索引、主鍵索引。
普通索引:
基本的索引類型,不會對數(shù)據(jù)加入任何限制,一樣允許添加了普通索引的普通索引的數(shù)據(jù)列存在空值或重復(fù)值,添加普通索引的目的只是為了查詢數(shù)據(jù)會更快一點(diǎn)。
唯一索引:
對單列添加唯一索引,就代表這個列只能是唯一值,比如用戶表用戶名可以添加唯一索引,這樣用戶名必須是唯一值,但是可以為空值。
主鍵索引:
其實(shí)就是在唯一索引的基礎(chǔ)上,不允許列出現(xiàn)空值的存在。
組合索引
選中數(shù)據(jù)表的多列組合然后創(chuàng)建索引,但是組合索引并不是說創(chuàng)建成功都可以被使用,而是需要遵循最左前綴集合。也就是只有在查詢條件中使用了這些字段的左邊字段,組合索引才會生效。下面我們舉個例子來解釋下什么叫做最左前綴。
首先創(chuàng)建一個表test1009,并且將id, username, sex三個列組合然后添加索引。
CREATE TABLE test_10_09 ( id INT NOT NULL, username VARCHAR (20) NOT NULL, idcard VARCHAR (18), sex VARCHAR (3) NOT NULL, INDEX MultiIdx (id, username, sex))我們說組合索引想要生效需要滿足最左前綴。那什么叫做最左前綴呢?最左前綴其實(shí)就是利用組合索引中最左邊的列來匹配數(shù)據(jù),以上面的例子我們可以看到,組合索引最左邊的列是id,所以說如果我們查詢的條件不包括id,也就是不滿足最左前綴原則,這時候查詢操作是無法利用到我們創(chuàng)建的組合索引的。我們可以使用EXPLAIN指令來測試查詢條件帶與不帶id會有什么效果:
可以看到我們帶id查詢可以通過索引去查詢,但是查詢不帶id查詢無法觸發(fā)最左前綴原則,于是組合索引并沒有生效。
全文索引
全文索引其實(shí)就是字面意思,使用全文索引可以在一連串文字中通過某個關(guān)鍵詞,就可以找到包含字段的記錄行。但是全文索引有著很多限制:
- 在InnoDB存儲引擎不支持使用,只允許在MyISAM存儲引擎中使用。
- 全文索引只能在char、varchar、text三種類型的數(shù)據(jù)列使用。
- 所搜的關(guān)鍵字默認(rèn)至少要4個字符。
- 全局索引要借助MATCH函數(shù)。
空間索引
- mysql 5.7開始支持空間索引。空間索引一般是適用于包含空間操作的系統(tǒng),比如游戲開發(fā)。
- 空間索引只能在GEOMETRY、POINT、LINESTRING、POLYGON4種空間數(shù)據(jù)類型的數(shù)據(jù)列使用。并且添加空間索引的數(shù)據(jù)列必須非空。
- 在創(chuàng)建空間索引必須使用SPATIAL關(guān)鍵字。
索引優(yōu)點(diǎn)
- 數(shù)據(jù)表的所有數(shù)據(jù)列都可以添加索引。
- 使用唯一索引或者主鍵索引可以保證數(shù)據(jù)的唯一性。
- 使用索引可以提高查詢數(shù)據(jù)的效率和性能。
索引缺點(diǎn)
- 使用索引會占用一定的物理空間。
- 數(shù)據(jù)插入以及修改都需要維護(hù)索引,會影響性能。
索引使用原則
- 經(jīng)常需要插入或者更新操作的表不宜設(shè)置太多索引,因?yàn)閿?shù)據(jù)插入以及修改都需要維護(hù)索引,會影響性能。
- 數(shù)據(jù)量少的表不建議添加索引,否則可能反而降低查詢效率及性能。
- 在列取值范圍比較少時不使用索引,比如專業(yè)名只有三個取值,使用索引意義確實(shí)不大。
- 組合索引將最經(jīng)常使用的列放在第一列,保證組合索引能滿足最左前綴的要求。
- 如果列取值唯一,可以為字段添加唯一性索引,提高查詢效率。
- 索引盡量添加在數(shù)據(jù)量比較少的列上面,比如varchar(100)檢索效率肯定沒有varchar(30)來得快,所以說數(shù)據(jù)量多的列添加索引查詢效率會更慢。
歡迎關(guān)注公眾號:程序猿周先森。文章原創(chuàng)于微信公眾號,本平臺不定時更新。
總結(jié)
以上是生活随笔為你收集整理的mysql 添加唯一索引_浅谈Mysql索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用IDM快速下载百度云文件
- 下一篇: 【VBScript恶搞代码】电脑自爆警告