最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL進(jìn)階之索引

 更新時(shí)間:2023年04月09日 15:54:31   作者:兜兜轉(zhuǎn)轉(zhuǎn)m  
索引就是一種數(shù)據(jù)結(jié)構(gòu),這種結(jié)構(gòu)類似,鏈表,樹等等。但是比它們要復(fù)雜的多,索引(index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)(有序),本文詳細(xì)介紹了MySQL索引,感興趣的同學(xué)可以參考閱讀

索引概述

介紹

索引(index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)(有序)。在數(shù)據(jù)之外,數(shù)據(jù)庫系統(tǒng)還維護(hù)著滿足 特定查找算法的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù), 這樣就可以在這些數(shù)據(jù)結(jié)構(gòu) 上實(shí)現(xiàn)高級查找算法,這種數(shù)據(jù)結(jié)構(gòu)就是索引。

索引就是一種數(shù)據(jù)結(jié)構(gòu),這種結(jié)構(gòu)類似,鏈表,樹等等。但是比它們要復(fù)雜的多。

為什么要用索引呢?

假如我們有如下數(shù)據(jù)

如果我們要查詢年齡=45的全部信息。

select * from tb_user where age = 45;

那么SQL是如何查詢呢?

MySQL需要進(jìn)行全表掃描,然后對比每條數(shù)據(jù)中的age值是否是45。

加入我們要100個(gè)數(shù)據(jù),那你繼續(xù)全表掃描找出age = 45;豈不是太麻煩了?

這是你是否想起來數(shù)據(jù)結(jié)構(gòu)中二叉搜索樹?我們將age的值映射到這個(gè)二叉搜索樹上,那么我們就可以快速查找到我們要的結(jié)果。age 到二叉搜索樹的過程就是索引。

注意:我們僅僅用二叉搜索樹舉例子,想信你肯定知道MySQL中的索引肯定比這個(gè)復(fù)雜。

此時(shí)我們對索引的理解更加深入了,索引僅僅是建立了一個(gè)數(shù)據(jù)結(jié)構(gòu),把數(shù)據(jù)存入到這個(gè)結(jié)構(gòu)上,方便MySQL查找數(shù)據(jù)罷了。

特點(diǎn)

索引結(jié)構(gòu)

MySQL的索引是在存儲引擎層實(shí)現(xiàn)的,不同的存儲引擎有不同的索引結(jié)構(gòu),主要包含以下幾種

上述是MySQL中所支持的所有的索引結(jié)構(gòu),接下來,我們再來看看不同的存儲引擎對于索引結(jié)構(gòu)的支持 情況。

我們主要看InnoDB就可以了,因?yàn)镸yISAM會被MongoDB代替,Memory會被Redis代替。

我們一般指的索引是指的是B+tree。

當(dāng)然B+tree肯定不是一上來就提出來的,肯定是有一個(gè)進(jìn)化的過程。

索引進(jìn)化的過程

我們都知道二叉搜索樹是一個(gè)方便存儲的結(jié)構(gòu),因?yàn)槠涮烊坏呐判?。左子樹都小于中間節(jié)點(diǎn),右子樹都大于中間節(jié)點(diǎn)。

但是它有什么缺點(diǎn)呢?在極端情況下會退化成鏈表。查找時(shí)間復(fù)雜度O(n),這不就等效于全表查詢了?

如何克服呢?使用紅黑樹,因?yàn)樗且环N平衡二叉樹??梢员苊獬霈F(xiàn)鏈表這種極端情況。

那么是不是使用紅黑樹就可以了?答案:還是不行,不夠理想。

為什么呢?因?yàn)槭嵌鏄?,如果MySQL中數(shù)據(jù)過多,那么將會出現(xiàn)樹的層級過深。

我們知道數(shù)據(jù)以Page為單位存入的,在Page切換查詢時(shí)會出現(xiàn)磁盤IO操作。層級過深就會造成IO頻繁。

如何解決上述問題呢?B-Tree出場。

B-Tree

B-Tree,B樹是一種多叉路衡查找樹,相對于二叉樹,B樹每個(gè)節(jié)點(diǎn)可以有多個(gè)分支,即多叉。 以一顆最大度數(shù)(max-degree)為5(5階)的b-tree為例,那這個(gè)B樹每個(gè)節(jié)點(diǎn)最多存儲4個(gè)key(每個(gè)key都可以存放數(shù)據(jù)),5 個(gè)指針:

是不是使用b樹就可以了呢?原則上是可以了,但是還有一種更優(yōu)的方案B+Tree 代替了BTree。

MySQL中的B+Tree 和BTree有什么不同呢?

  • B+Tree只在葉子節(jié)點(diǎn)存儲數(shù)據(jù),從而保證每個(gè)Page中存入更多的key。
  • 葉子節(jié)點(diǎn)包含了根節(jié)點(diǎn)和非葉子節(jié)點(diǎn)--圖中紅框顯示。
  • 葉子節(jié)點(diǎn)采用雙向循環(huán)鏈表連接,方便查找。

 因此我們可以回答:為什么MySQL采用B+Tree呢?

到此這篇關(guān)于MySQL進(jìn)階之索引的文章就介紹到這了,更多相關(guān)MySQL索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • MySQL排序檢索數(shù)據(jù)操作方法梳理

    MySQL排序檢索數(shù)據(jù)操作方法梳理

    SELECT語句是SQL中最常用的語句。它的用途是從一個(gè)或多個(gè)表中檢索信息。為了使用SELECT檢索表數(shù)據(jù),必須至少給出兩條信息:想選擇什么、從什么地方選擇,這篇文章主要介紹了MySQL排序檢索數(shù)據(jù)
    2022-10-10
  • 淺析一個(gè)MYSQL語法(在查詢中使用count)的兼容性問題

    淺析一個(gè)MYSQL語法(在查詢中使用count)的兼容性問題

    本篇文章是對MYSQL語法(在查詢中使用count)的兼容性問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • MySQL數(shù)據(jù)庫主機(jī)127.0.0.1與localhost區(qū)別

    MySQL數(shù)據(jù)庫主機(jī)127.0.0.1與localhost區(qū)別

    這篇文章主要介紹了MySQL主機(jī)127.0.0.1與localhost區(qū)別總結(jié),需要的朋友可以參考下
    2018-06-06
  • MySQL悲觀鎖與樂觀鎖的實(shí)現(xiàn)方案

    MySQL悲觀鎖與樂觀鎖的實(shí)現(xiàn)方案

    我們知道Mysql并發(fā)事務(wù)會引起更新丟失問題,解決辦法是鎖,所以本文將對鎖(樂觀鎖、悲觀鎖)進(jìn)行分析,這篇文章主要給大家介紹了關(guān)于MySQL悲觀鎖與樂觀鎖方案的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • sqlite遷移到mysql腳本的方法

    sqlite遷移到mysql腳本的方法

    這篇文章主要介紹了sqlite遷移到mysql腳本的方法,需要的朋友可以參考下
    2017-08-08
  • 導(dǎo)致mysqld無法啟動的一個(gè)錯(cuò)誤問題及解決

    導(dǎo)致mysqld無法啟動的一個(gè)錯(cuò)誤問題及解決

    這篇文章主要介紹了導(dǎo)致mysqld無法啟動的一個(gè)錯(cuò)誤問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • centos7下安裝mysql全過程

    centos7下安裝mysql全過程

    這篇文章主要介紹了centos7下安裝mysql全過程,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 一文學(xué)習(xí)MySQL?意向共享鎖、意向排他鎖、死鎖

    一文學(xué)習(xí)MySQL?意向共享鎖、意向排他鎖、死鎖

    這篇文章主要介紹了MySQL?意向共享鎖、意向排他鎖、死鎖,包括InnoDB表級鎖,意向共享鎖和意向排他鎖及操作方法,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • workerman寫mysql連接池的實(shí)例代碼

    workerman寫mysql連接池的實(shí)例代碼

    在本篇文章中小編給大家分享的是一篇關(guān)于workerman寫mysql連接池的實(shí)例代碼內(nèi)容,有需要的朋友們可以參考下。
    2020-01-01
  • 最新評論

    莱阳市| 汕头市| 阿图什市| 古丈县| 泽普县| 含山县| 同德县| 黄大仙区| 林甸县| 龙江县| 博野县| 呼伦贝尔市| 新沂市| 乌兰浩特市| 肇源县| 洪湖市| 盐城市| 青冈县| 泽普县| 谷城县| 上栗县| 清水河县| 盐山县| 晋宁县| 遂溪县| 虹口区| 彩票| 年辖:市辖区| 沁水县| 威宁| 湘潭县| 恭城| 龙陵县| 黔西县| 漠河县| 通海县| 遂昌县| 丹棱县| 和龙市| 渑池县| 巴青县|