MySQL索引

索引是什么

  1. 索引是一種幫助數(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ù)


    image.png
  • B+樹

  1. 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ù)


image.png
  • Hash
    如下圖,hash索引是指通過hash函數(shù)計(jì)算hash值存儲(chǔ)到對(duì)應(yīng)的槽位中星澳,如果有hash沖突可通過鏈表法或者再hash等方法解決
    hash索引特點(diǎn):
    1疚顷、可用于 = 或者 in 的查詢,不支持范圍查詢(between禁偎,>腿堤,<)的查詢
    2、不可用于排序查詢
    3届垫、查詢效率高释液,一次查詢即可命中結(jié)果(沒有出現(xiàn)鏈表的情況下)
image.png

索引有哪些

按存儲(chǔ)結(jié)構(gòu)區(qū)分
  1. B-樹索引

  2. B+樹索引

  3. Hash索引

按用途區(qū)分
  1. 普通索引
    一般指為了提高查詢效率所創(chuàng)建的索引,沒有其他的特性装处。
  2. 主鍵索引
    每張表都會(huì)有自己的主鍵索引误债,主鍵索引不允許為null,當(dāng)沒有顯式指定表的主鍵時(shí)妄迁,InnoDB會(huì)先檢查表中是否有唯一索引的字段寝蹈,如果有,則選擇該字段為默認(rèn)的主鍵登淘,否則將自動(dòng)創(chuàng)建一個(gè)6字節(jié)的自增主鍵箫老。
  3. 唯一索引
    唯一索引的屬性列值不允許重復(fù),但是允許為空黔州。建立唯一索引的目的大部分是為了屬性列的數(shù)據(jù)唯一性耍鬓,而不是為了查詢效率阔籽。
  4. 前綴索引
    前綴索引只適合字符串類型的數(shù)據(jù),前綴索引是對(duì)文本的前幾個(gè)字符串創(chuàng)建索引牲蜀,比普通索引建立的索引空間更小笆制,因?yàn)橹蝗∏皫讉€(gè)字符。
  5. 全文索引
  • 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索引的表中快得多横漏。
  1. 空間索引
  • 空間索引是一種將空間數(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ù)分
  1. 聚集索引
    聚集索引即索引結(jié)構(gòu)和數(shù)據(jù)一起存放的索引钠龙。主鍵索引屬于聚集索引(InnoDB中也只有主鍵索引才能使聚集索引),聚集索引通過主鍵查詢時(shí)可以直接返回?cái)?shù)據(jù),不需要經(jīng)過回表查詢
  2. 輔助索引(非聚集索引)
    非聚集索引即索引和數(shù)據(jù)分開存放的索引碴里,非聚集索引通過索引定位到id(主鍵)沈矿,再通過id回表查詢行數(shù)據(jù)。不過也不一定需要回表并闲,如果建立了的是覆蓋索引則可以直接返回要查詢的數(shù)據(jù)
  3. 覆蓋索引
    如果一個(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)中獲取到嗓违,不需要回表

索引的作用

  1. 索引大大減少了服務(wù)器需要掃描的數(shù)據(jù)量
  2. 索引可以幫助服務(wù)器避免排序和臨時(shí)表
  3. 索引可以將隨機(jī)I/O變?yōu)轫樞騃/O

索引怎么用

  1. 給哪些字段建索引
    1九巡、索引字段主要是根據(jù)我們的業(yè)務(wù)來確定,一般來說如果業(yè)務(wù)查詢條件建立索引會(huì)提高查詢效率蹂季,如果是表數(shù)據(jù)太多則建議使用第三方搜索引擎比如elasticsearch等查詢到主鍵后在從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)
  2. 索引失效的場(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)制走索引查詢
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涕滋,一起剝皮案震驚了整個(gè)濱河市睬辐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宾肺,老刑警劉巖溯饵,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異锨用,居然都是意外死亡丰刊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門增拥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啄巧,“玉大人,你說我怎么就攤上這事跪者】妹保” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵渣玲,是天一觀的道長(zhǎng)逗概。 經(jīng)常有香客問我,道長(zhǎng)忘衍,這世上最難降的妖魔是什么逾苫? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任卿城,我火速辦了婚禮,結(jié)果婚禮上铅搓,老公的妹妹穿的比我還像新娘瑟押。我一直安慰自己,他們只是感情好星掰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布多望。 她就那樣靜靜地躺著,像睡著了一般氢烘。 火紅的嫁衣襯著肌膚如雪怀偷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天播玖,我揣著相機(jī)與錄音椎工,去河邊找鬼。 笑死蜀踏,一個(gè)胖子當(dāng)著我的面吹牛维蒙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播果覆,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼颅痊,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了随静?” 一聲冷哼從身側(cè)響起八千,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎燎猛,沒想到半個(gè)月后恋捆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡重绷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年沸停,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昭卓。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡愤钾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出候醒,到底是詐尸還是另有隱情能颁,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布倒淫,位于F島的核電站伙菊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜镜硕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一运翼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兴枯,春花似錦血淌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至峰伙,卻和暖如春疗疟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞳氓。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栓袖,地道東北人匣摘。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像裹刮,于是被迫代替她去往敵國(guó)和親音榜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容