索引是什么
- 索引是一種幫助數(shù)據(jù)庫(kù)高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)作谚,它是表中一列或者若干列值的集合和指向表中物理標(biāo)識(shí)這些值的數(shù)據(jù)頁(yè)的邏輯指針拦惋,比如一本書的目錄部分媚送,指向了具體的章節(jié)和頁(yè)號(hào)噩咪,可以快速的定位數(shù)據(jù)吩愧,提高查詢效率芋酌。
索引的原理
-
B-樹
B-樹的特點(diǎn):
a. 一個(gè)m階的B-樹,每個(gè)節(jié)點(diǎn)最多有m個(gè)子節(jié)點(diǎn)
b.每個(gè)節(jié)點(diǎn)除了索引值外還包含行的數(shù)據(jù)
B+樹
- B+樹的特點(diǎn):
a. 非葉子節(jié)點(diǎn)只存儲(chǔ)索引數(shù)據(jù)雁佳,不存行數(shù)據(jù)脐帝,
b. 指針存儲(chǔ)子節(jié)點(diǎn)的地址信息
c.葉子節(jié)點(diǎn)有序且是一個(gè)雙向鏈表結(jié)構(gòu)
為什么非葉子節(jié)點(diǎn)只存儲(chǔ)所以數(shù)據(jù),不存行數(shù)據(jù)糖权?
a. 增加節(jié)點(diǎn)索引值的個(gè)數(shù)堵腹,減少樹的深度
b. 減少索引查詢時(shí)磁盤I/O次數(shù)
- Hash
如下圖,hash索引是指通過hash函數(shù)計(jì)算hash值存儲(chǔ)到對(duì)應(yīng)的槽位中星澳,如果有hash沖突可通過鏈表法或者再hash等方法解決
hash索引特點(diǎn):
1疚顷、可用于 = 或者 in 的查詢,不支持范圍查詢(between禁偎,>腿堤,<)的查詢
2、不可用于排序查詢
3届垫、查詢效率高释液,一次查詢即可命中結(jié)果(沒有出現(xiàn)鏈表的情況下)
索引有哪些
按存儲(chǔ)結(jié)構(gòu)區(qū)分
B-樹索引
B+樹索引
Hash索引
按用途區(qū)分
- 普通索引
一般指為了提高查詢效率所創(chuàng)建的索引,沒有其他的特性装处。 - 主鍵索引
每張表都會(huì)有自己的主鍵索引误债,主鍵索引不允許為null,當(dāng)沒有顯式指定表的主鍵時(shí)妄迁,InnoDB會(huì)先檢查表中是否有唯一索引的字段寝蹈,如果有,則選擇該字段為默認(rèn)的主鍵登淘,否則將自動(dòng)創(chuàng)建一個(gè)6字節(jié)的自增主鍵箫老。 - 唯一索引
唯一索引的屬性列值不允許重復(fù),但是允許為空黔州。建立唯一索引的目的大部分是為了屬性列的數(shù)據(jù)唯一性耍鬓,而不是為了查詢效率阔籽。 - 前綴索引
前綴索引只適合字符串類型的數(shù)據(jù),前綴索引是對(duì)文本的前幾個(gè)字符串創(chuàng)建索引牲蜀,比普通索引建立的索引空間更小笆制,因?yàn)橹蝗∏皫讉€(gè)字符。 - 全文索引
- MySQL中的全文索引是FultLeXT類型的索引涣达。
- 全文索引只能用于InnoDB或MyISAM表在辆,只能為CHAR、VARCHAR度苔、TEXT列創(chuàng)建匆篓。
- 在MySQL 5.7.6中,MySQL提供了支持中文寇窑、日文和韓文(CJK)的內(nèi)置全文ngram解析器鸦概,以及用于日文的可安裝MeCab全文解析器插件
- 當(dāng)創(chuàng)建表時(shí),可以在CREATE TABLE語(yǔ)句中給出FULLTEXT索引定義疗认,或者稍后使用ALTER TABLE或CREATE INDEX添加該定義完残。
- 對(duì)于大型數(shù)據(jù)集,將數(shù)據(jù)加載到?jīng)]有FULLTEXT索引的表中然后創(chuàng)建索引要比將數(shù)據(jù)加載到具有現(xiàn)有FULLTEXT索引的表中快得多横漏。
- 空間索引
- 空間索引是一種將空間數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中的索引方式谨设。它可以提高空間數(shù)據(jù)的查詢效率,減少查詢時(shí)間缎浇,同時(shí)也可以優(yōu)化空間數(shù)據(jù)的存儲(chǔ)方式扎拣。
- 當(dāng)需要查詢某個(gè)區(qū)域內(nèi)的空間數(shù)據(jù)時(shí),如果沒有空間索引素跺,數(shù)據(jù)庫(kù)會(huì)掃描整個(gè)表二蓝,查詢效率會(huì)非常低下。而建立空間索引可以將空間數(shù)據(jù)分成多個(gè)小區(qū)域指厌,縮小查詢范圍刊愚,提高查詢效率
- 這個(gè)空間類型的列必須使用MySQL提供的空間數(shù)據(jù)類型進(jìn)行定義,例如POINT踩验、LINESTRING鸥诽、POLYGON等
- 空間索引的優(yōu)點(diǎn)是可以提高查詢效率,縮小查詢范圍箕憾,同時(shí)也可以優(yōu)化空間數(shù)據(jù)的存儲(chǔ)方式牡借。但是,空間索引的缺點(diǎn)是建立索引需要占用大量的存儲(chǔ)空間袭异,同時(shí)也會(huì)影響更新和插入操作的速度
按查詢次數(shù)分
- 聚集索引
聚集索引即索引結(jié)構(gòu)和數(shù)據(jù)一起存放的索引钠龙。主鍵索引屬于聚集索引(InnoDB中也只有主鍵索引才能使聚集索引),聚集索引通過主鍵查詢時(shí)可以直接返回?cái)?shù)據(jù),不需要經(jīng)過回表查詢 - 輔助索引(非聚集索引)
非聚集索引即索引和數(shù)據(jù)分開存放的索引碴里,非聚集索引通過索引定位到id(主鍵)沈矿,再通過id回表查詢行數(shù)據(jù)。不過也不一定需要回表并闲,如果建立了的是覆蓋索引則可以直接返回要查詢的數(shù)據(jù) - 覆蓋索引
如果一個(gè)索引包含所有需要查詢的字段的值细睡,我們就稱之為“覆蓋索引”谷羞,比如我們下面的sql
select name from t_user帝火,當(dāng)我們給name建立了索引后,如果是InnoDB存儲(chǔ)引擎湃缎,會(huì)在葉子節(jié)點(diǎn)存儲(chǔ)name的值以及主鍵犀填,當(dāng)我們只需要查詢name時(shí),可以直接在葉子節(jié)點(diǎn)中獲取到嗓违,不需要回表
索引的作用
- 索引大大減少了服務(wù)器需要掃描的數(shù)據(jù)量
- 索引可以幫助服務(wù)器避免排序和臨時(shí)表
- 索引可以將隨機(jī)I/O變?yōu)轫樞騃/O
索引怎么用
- 給哪些字段建索引
1九巡、索引字段主要是根據(jù)我們的業(yè)務(wù)來確定,一般來說如果業(yè)務(wù)查詢條件建立索引會(huì)提高查詢效率蹂季,如果是表數(shù)據(jù)太多則建議使用第三方搜索引擎比如elasticsearch等查詢到主鍵后在從數(shù)據(jù)庫(kù)獲取數(shù)據(jù) - 索引失效的場(chǎng)景
一般是指sql的where字段沒有使用到索引冕广,可以用一句話總結(jié):模型數(shù)空運(yùn)最快
模:模糊查詢
型:sql的類型和字段類型不一致
數(shù):對(duì)條件字段做函數(shù)運(yùn)算
空:字段為空時(shí),不建立索引偿洁,所以不會(huì)用到
運(yùn):做一些運(yùn)算操作撒汉,比如加減乘除
最:最左匹配原則
快:mysql的優(yōu)化策略認(rèn)為不走索引時(shí)查詢的數(shù)據(jù)最快會(huì)不走索引,可以通過force index強(qiáng)制走索引查詢