MySQL隨筆04_索引(上)

一、什么是索引

索引是對數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu),使用索引可以快速訪問數(shù)據(jù)庫表中的特定信息。

索引的主要目的就是加快檢索表中數(shù)據(jù)葵擎,是一種輔助查詢的數(shù)據(jù)結(jié)構(gòu)。

二半哟、索引的模型酬滤、實(shí)現(xiàn)方式

可以用于提高讀寫效率的數(shù)據(jù)結(jié)構(gòu)比較多,三種常見的數(shù)據(jù)結(jié)構(gòu):哈希表寓涨、有序數(shù)組盯串、搜索樹

哈希表

以鍵值對存儲數(shù)據(jù)的結(jié)構(gòu)戒良√迥螅可直接根據(jù)待查找的鍵key,就可以找到其對應(yīng)的值value蔬墩。

哈希實(shí)現(xiàn)思路 將值存儲在數(shù)組中译打,通過一個哈希函數(shù)把key計算成數(shù)組的一個確定的位置,然后把value放在該位置中拇颅,即存儲位置=f(key)奏司,f 為哈希函數(shù)。

哈希沖突 也稱為 哈希碰撞 指若是多個key經(jīng)過哈希函數(shù)計算得到同一個值(地址)樟插。

哈希沖突解決方案 主要有:

  1. 開放定址法——發(fā)生沖突時韵洋,繼續(xù)尋找下一塊未被占用的存儲地址竿刁。
  2. 再散列函數(shù)法。
  3. 鏈地址法搪缨。HashMap即是采用的此方法食拜,即 數(shù)組+鏈表 (單鏈表)的方式。

適用場景 哈希表適用于只有等值查詢的場景副编,對于區(qū)間查詢需要全部掃描负甸。

有序數(shù)組

適用場景 有序數(shù)組在等值查詢和范圍查詢場景中的性能都非常的優(yōu)秀,但 有序數(shù)組索引只適用于靜態(tài)存儲引擎 痹届,因?yàn)楦虏僮鲿赡軙婕暗揭苿雍竺娴乃袛?shù)據(jù)記錄呻待,成本太高。

搜索樹

二叉搜索樹 也可以用來做索引的數(shù)據(jù)模型队腐,查詢的時間復(fù)雜度為O(log(N))蚕捉,為了維持這個查詢復(fù)雜度,則需要保持這顆樹是 平衡二叉樹 柴淘,為了這個保證迫淹,更新的時間復(fù)雜度也是O(log(N))。

二叉搜索樹 是搜索效率最高的为严,但是實(shí)際上大多數(shù)的數(shù)據(jù)庫存儲卻并不適用二叉樹敛熬,原因是:索引不止存在內(nèi)存中,還要寫到磁盤上梗脾。

為了讓一個查詢盡量少讀磁盤荸型,就必須讓查詢過程訪問盡量少的數(shù)據(jù)塊,這樣的話應(yīng)該適用 N叉樹 炸茧,而不是 二叉樹 瑞妇。 N叉樹 由于在讀寫性能上的優(yōu)點(diǎn),以及適配磁盤的訪問模式梭冠,被廣泛應(yīng)用在數(shù)據(jù)庫引擎中了辕狰。

三、InnoDB 的索引模型

在MySQL中控漠,索引是在引擎層實(shí)現(xiàn)的蔓倍,所以并沒有統(tǒng)一的索引標(biāo)準(zhǔn),即不同的存儲引擎的索引的工作方式不一樣盐捷。

索引組織表 在InnoDB中偶翅,表都是根據(jù)主鍵順序以索引的形式存放的,這種存儲方式的表稱為索引組織表碉渡。

InnoDB使用了 B+樹索引模型 聚谁,所以數(shù)據(jù)都是存儲在 B+樹 中的,每一個索引在InnoDB里面對應(yīng)一顆 B+樹 滞诺。

索引類型

主要分為:主鍵索引形导、非主鍵索引(唯一索引环疼、普通索引)。

主鍵索引 的葉子節(jié)點(diǎn)保存整行數(shù)據(jù)朵耕。在InnoDB中炫隶,也被稱為 聚簇索引 (clustered index)。

非主鍵索引 的葉子節(jié)點(diǎn)內(nèi)容是主鍵的值阎曹。在InnoDB中伪阶,也被稱為 二級索引 (secondary index)。

主鍵索引與普通索引查詢區(qū)別
  • 主鍵索引查詢芬膝,只需要搜索主鍵索引這顆B+Tree望门。

  • 而普通索引查詢形娇,則要先搜索普通索引樹锰霜,得到主鍵列的值,再到主鍵索引樹搜索一次桐早,這個過程被稱為 回表 癣缅。

綜上,基于非主鍵索引的查詢需要多掃描一個索引樹哄酝,因此在使用中應(yīng)盡量使用主鍵查詢友存。

InnoDB索引組織結(jié)構(gòu)示意圖如下,其中ID為表主鍵陶衅,k為非主鍵索引列屡立。


file

四、索引維護(hù)

B+樹為了維護(hù)索引有序性搀军,在插入新值的時候需要做必要的維護(hù)膨俐。

頁分裂 若是往數(shù)據(jù)中間插入新的數(shù)據(jù),而對應(yīng)的數(shù)據(jù)頁已滿罩句,根據(jù)B+樹算法焚刺,此時需要申請一個新的數(shù)據(jù)頁,然后挪動部分?jǐn)?shù)據(jù)過去门烂,此過程稱為 頁分裂 乳愉。

頁分裂影響:

  1. 導(dǎo)致性能下降;
  2. 影響數(shù)據(jù)頁的利用率屯远,原本可放在一個頁的數(shù)據(jù)被分到兩個頁中蔓姚,整體空間利用率降低約50%。

頁合并 相鄰兩個頁由于數(shù)據(jù)刪除慨丐,利用率很低之后坡脐,會將數(shù)據(jù)頁做合并,合并的過程稱為 頁合并 咖气。

自增主鍵的適用場景

哪些場景下應(yīng)該使用自增主鍵挨措,哪些場景下使用業(yè)務(wù)字段做主鍵挖滤?(ps:業(yè)務(wù)字段做主鍵需保證唯一性)

性能 上考慮,自增主鍵模式浅役,符合遞增插入場景斩松,都是追加操作,不涉及數(shù)據(jù)挪動觉既,也不會觸發(fā)葉子節(jié)點(diǎn)的分裂惧盹; 而業(yè)務(wù)字段做主鍵的模式,不容易保證有序插入瞪讼,寫數(shù)據(jù)成本相對較高钧椰。

存儲空間 上考慮,由于每個非主鍵索引的葉子節(jié)點(diǎn)上都是主鍵的值符欠,主鍵長度越小嫡霞,普通索引的葉子節(jié)點(diǎn)就越小,普通索引占用的空間也越小希柿。因此在選擇上诊沪,要考慮 業(yè)務(wù)字段自增主鍵字段 本身的長度。

綜上曾撤,從性能和存儲空間方面考量端姚,自增主鍵往往是更合理的選擇。

業(yè)務(wù)字段直接做主鍵的場景
  1. 只有一個索引挤悉;
  2. 該索引必須是唯一索引渐裸。

即在沒有其他索引時,也就不用考慮其他索引的葉子節(jié)點(diǎn)大小的問題了装悲。

五昏鹃、小結(jié)

file

參考資料:

  1. 深入淺出索引(上)
  2. Java集合之一—HashMap

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衅斩,一起剝皮案震驚了整個濱河市盆顾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畏梆,老刑警劉巖您宪,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奠涌,居然都是意外死亡宪巨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門溜畅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捏卓,“玉大人,你說我怎么就攤上這事慈格〉∏纾” “怎么了遥金?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蒜田。 經(jīng)常有香客問我稿械,道長,這世上最難降的妖魔是什么冲粤? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任美莫,我火速辦了婚禮,結(jié)果婚禮上梯捕,老公的妹妹穿的比我還像新娘厢呵。我一直安慰自己,他們只是感情好傀顾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布襟铭。 她就那樣靜靜地躺著,像睡著了一般锣笨。 火紅的嫁衣襯著肌膚如雪蝌矛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天错英,我揣著相機(jī)與錄音,去河邊找鬼隆豹。 笑死椭岩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的璃赡。 我是一名探鬼主播判哥,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碉考!你這毒婦竟也來了塌计?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤侯谁,失蹤者是張志新(化名)和其女友劉穎锌仅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墙贱,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡热芹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惨撇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伊脓。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖魁衙,靈堂內(nèi)的尸體忽然破棺而出报腔,到底是詐尸還是另有隱情株搔,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布纯蛾,位于F島的核電站邪狞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏茅撞。R本人自食惡果不足惜帆卓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望米丘。 院中可真熱鬧剑令,春花似錦、人聲如沸拄查。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽堕扶。三九已至碍脏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稍算,已是汗流浹背典尾。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糊探,地道東北人钾埂。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像科平,于是被迫代替她去往敵國和親褥紫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354