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

MySQL之InnoDB存儲引擎中的索引用法及說明

 更新時間:2025年06月26日 16:10:34   作者:在成都搬磚的鴨鴨  
這篇文章主要介紹了MySQL之InnoDB存儲引擎中的索引用法及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

1、背景

InnoDB存儲引擎的基本存儲單位是頁,索引也是存儲在頁上的,B+樹中非葉子節(jié)點(diǎn)的頁也是數(shù)據(jù)頁,和我們插入數(shù)據(jù)的區(qū)別是存放的行記錄叫目錄項(xiàng)記錄,我們插入的行記錄叫用戶記錄

B+樹由葉子節(jié)點(diǎn)和非葉子節(jié)點(diǎn)組成,葉子節(jié)點(diǎn)只有一層,用來存放用戶記錄,非葉子節(jié)點(diǎn)可以由一層或多層組成,用來存放目錄項(xiàng)記錄。

B+樹這種結(jié)構(gòu)是為了方便我們查找想要的數(shù)據(jù),可以將B+樹這種結(jié)構(gòu)叫索引,建議先參考一下上篇文章講解的,接下來我們就來學(xué)習(xí)一下索引到底是什么。

2、準(zhǔn)備

創(chuàng)建一個表并插入一些數(shù)據(jù)用來演示索引:

#創(chuàng)建表
CREATE TABLE test
(
    id INT AUTO_INCREMENT PRIMARY KEY,
    str VARCHAR(255) NOT NULL DEFAULT ''
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

#插入數(shù)據(jù)
INSERT INTO test (str)
VALUES ('AAA'),
       ('BBB'),
       ('CCC');

查看記錄:

mysql [xxx]> select * from test;
+----+-----+
| id | str |
+----+-----+
|  1 | AAA |
|  2 | BBB |
|  3 | CCC |
+----+-----+
3 rows in set (0.001 sec)

3、正篇

【1】存儲用戶記錄的數(shù)據(jù)頁

上面的3條記錄可以用如下圖表示,為了簡介只展示主要字段:

在這里插入圖片描述

一個頁面上的主鍵是順序排列的,當(dāng)要通過主鍵查找數(shù)據(jù)時,如果數(shù)據(jù)全在一張頁上,通過二分法很快就能找到所查找的主鍵,但如果我們不通過主鍵查找數(shù)據(jù),或者數(shù)據(jù)在很多張頁上,頁之間并不是連續(xù)存儲的,這個時候就要遍歷所有頁所有數(shù)據(jù),索引就是為解決這個問題而生的。

【2】存儲目錄項(xiàng)記錄的數(shù)據(jù)頁

目錄項(xiàng)記錄和用戶記錄的區(qū)別就是record_type的值為1,也代表B+樹非葉子節(jié)點(diǎn)記錄,還有一個區(qū)別就是min_rec_mask(B+樹非葉子節(jié)點(diǎn)中的最小記錄)不同,給一個3層B+樹的例子如圖:

在這里插入圖片描述

從上網(wǎng)往下數(shù),最上面一層叫根節(jié)點(diǎn),第二層叫非葉子節(jié)點(diǎn),第三層叫葉子節(jié)點(diǎn)。

1、根節(jié)點(diǎn)和非葉子節(jié)點(diǎn)中的目錄項(xiàng)記錄根據(jù)主鍵大小進(jìn)行排序,最左邊的記錄主鍵id在這個頁中最小,所以它的min_rec_mask屬性為1,根節(jié)點(diǎn)只有一個頁,對根節(jié)點(diǎn)的目錄項(xiàng)記錄進(jìn)行二分法很快就能找到下一個層級的數(shù)據(jù)頁,然后再進(jìn)行二分法得到要查的頁,最后再對頁里的用戶數(shù)據(jù)進(jìn)行二分法找到指定的記錄。

2、葉子節(jié)點(diǎn)只有一層,葉子節(jié)點(diǎn)的頁全部是用來存儲用戶記錄。

【3】聚簇索引

主鍵索引就是聚簇索引,聚簇索引,滿足以下條件:

  • 1、一個頁上的所有用戶記錄或者目錄項(xiàng)記錄根據(jù)主鍵大小形成一個單向鏈表。
  • 2、B+樹同一層級的所有頁根據(jù)主鍵大小形成一個雙向鏈表。
  • 3、B+樹葉子節(jié)點(diǎn)存放用戶項(xiàng)記錄包含所有列的數(shù)據(jù)。

【4】二級索引

聚簇索引只有在根據(jù)主鍵進(jìn)行查找的時候能使用對應(yīng)的B+樹,根據(jù)其它列去查找時就要進(jìn)行全表掃描了,我們給上述例子中str列也設(shè)置索引:

ALTER TABLE test ADD INDEX str (str);

設(shè)置完之后會產(chǎn)出一顆新的B+樹,如圖:

在這里插入圖片描述

str列建的B+樹由如下特性:

1、頁里的目錄項(xiàng)記錄和用戶記錄根據(jù)str列大小組成一個單向鏈表。

2、每層節(jié)點(diǎn)的所有頁根據(jù)str列大小組成一個雙向鏈表。

3、葉子節(jié)點(diǎn)存儲的數(shù)據(jù)部分其實(shí)只有str列和主鍵大小,因?yàn)檫@里建表的列字段只有str列和主鍵,假如有多個列,要想知道其它列的信息,我們就得根據(jù)查出來的str列對應(yīng)的主鍵到聚簇隨意對應(yīng)的B+樹里去找到其它列數(shù)據(jù),這種查找方式就叫"回表"。

我們這里只有主鍵和str兩列,所以不需要回表就能得到所有列的數(shù)據(jù),這種需要最多進(jìn)行一次回表的B+樹,被稱為"二級索引"。

二級索引對應(yīng)的目錄項(xiàng)記錄有個要注意的地方:

并不是只存儲了str列和頁號,還存儲了主鍵值,這是為了插入記錄的str列相同時,需要根據(jù)主鍵的不同來確定將記錄插入到哪個頁。

【5】組合索引

給多個列建一顆B+樹就叫組合索引,假設(shè)有這樣一個表:

CREATE TABLE test
(
    id INT AUTO_INCREMENT PRIMARY KEY,
    str1 VARCHAR(255) NOT NULL DEFAULT '',
    str2 VARCHAR(255),
    str3 CHAR(5)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

建立組合索引的sql語句:

ALTER TABLE test ADD INDEX str1_str2_str3 (str1, str2, str3);

上面組合索引有這樣的特性:

  • 1、所有頁和行記錄先根據(jù)str1的大小順序進(jìn)行排列。
  • 2、在str1相同的情況下根據(jù)str2的大小順序進(jìn)行排列。
  • 3、在str2相同的情況下再根據(jù)str3的大小順序進(jìn)行排列。
  • 4、B+樹中的所有頁和頁里所有行記錄會根據(jù)3個列的大小分別組成雙向鏈表和單向鏈表。

4、總結(jié)

通過本文學(xué)習(xí)到了,索引就是B+樹對應(yīng)的結(jié)構(gòu),放了方便我們根據(jù)某列快速找到想要的記錄,根據(jù)B+ 樹的不同又可以分為:聚簇索引、二級索引、組合索引。

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mysql連接錯誤2013的問題及解決

    mysql連接錯誤2013的問題及解決

    這篇文章主要介紹了mysql連接錯誤2013的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 升級到MySQL5.7后開發(fā)不得不注意的一些坑

    升級到MySQL5.7后開發(fā)不得不注意的一些坑

    這篇文章主要給大家介紹了關(guān)于升級到MySQL5.7后開發(fā)不得不注意的一些坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • 新手把mysql裝進(jìn)docker中碰到的各種問題

    新手把mysql裝進(jìn)docker中碰到的各種問題

    這篇文章主要給大家介紹了新手第一次把mysql裝進(jìn)docker中可能碰到的各種問題,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 史上最簡單的MySQL數(shù)據(jù)備份與還原教程(上)(三十五)

    史上最簡單的MySQL數(shù)據(jù)備份與還原教程(上)(三十五)

    這篇文章主要為大家詳細(xì)介紹了史上最簡單的MySQL數(shù)據(jù)備份與還原教程第一篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • MySQL異常宕機(jī)無法啟動的處理過程

    MySQL異常宕機(jī)無法啟動的處理過程

    MySQL宕機(jī)是指MySQL數(shù)據(jù)庫服務(wù)突然停止運(yùn)行,通??赡苁怯捎谟布收稀④浖e誤、資源耗盡、網(wǎng)絡(luò)中斷、配置問題或是惡意攻擊等導(dǎo)致,當(dāng)MySQL發(fā)生宕機(jī)時,系統(tǒng)可能無法提供數(shù)據(jù)訪問,本文給大家介紹了MySQL異常宕機(jī)無法啟動的處理過程,需要的朋友可以參考下
    2024-08-08
  • 深入解析MySQL的窗口函數(shù)

    深入解析MySQL的窗口函數(shù)

    這篇文章主要介紹了深入解析MySQL的窗口函數(shù),窗口可以理解為記錄集合,窗口函數(shù)就是在滿足某種條件的記錄集合上執(zhí)行的特殊函數(shù),即:應(yīng)用在窗口內(nèi)的函數(shù),需要的朋友可以參考下
    2023-07-07
  • mysql使用mysqld_multi部署單機(jī)多實(shí)例的方法教程

    mysql使用mysqld_multi部署單機(jī)多實(shí)例的方法教程

    這篇文章主要給大家介紹了關(guān)于mysql使用mysqld_multi部署單機(jī)多實(shí)例的相關(guān)資料,文中通過示例代碼將實(shí)現(xiàn)的步驟一步步介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Java連接MySql的詳細(xì)介紹

    Java連接MySql的詳細(xì)介紹

    本篇文章主要是對Java連接MySql的詳細(xì)介紹。需要的朋友參考下
    2013-04-04
  • Mysql性能優(yōu)化案例研究-覆蓋索引和SQL_NO_CACHE

    Mysql性能優(yōu)化案例研究-覆蓋索引和SQL_NO_CACHE

    這篇文章主要介紹了Mysql性能優(yōu)化案例研究-覆蓋索引和SQL_NO_CACHE,需要的朋友可以參考下
    2016-03-03
  • 詳解MySQL主從不一致情形與解決方法

    詳解MySQL主從不一致情形與解決方法

    這篇文章主要介紹了詳解MySQL主從不一致情形與解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04

最新評論

霍州市| 巴青县| 垫江县| 会同县| 郴州市| 三都| 永善县| 宜宾县| 平度市| 双桥区| 广平县| 虹口区| 嫩江县| 泉州市| 手机| 孟村| 济南市| 江津市| 太白县| 砚山县| 道孚县| 泾阳县| 凤凰县| 汶川县| 德江县| 上栗县| 衢州市| 都匀市| 常熟市| 荃湾区| 达州市| 淅川县| 佛教| 东安县| 女性| 济南市| 云龙县| 永清县| 扶余县| 高唐县| 策勒县|