主頁 >  其他 > 可能面試官都沒想到:我的MySQL索引底層技術竟會如此扎實!

可能面試官都沒想到:我的MySQL索引底層技術竟會如此扎實!

2020-11-04 22:11:07 其他

前言

不知道你在面試的時候有沒有被問到MySQL的索引?作為互聯網大廠面試題的常客,與平時CRUD增刪改查不同,今天我們來聊聊底層的技術!

同時我也在B站上講過相關MySQL視頻,視頻傳送門:MYSQL底層原理教程全集

在這里插入圖片描述

同時也準備好了面試題的相關資料:
資料領取方式:點擊這里【暗號:CSDN】

在這里插入圖片描述

區域性原理

在InnoDB中,資料會存盤到磁盤上,在真正處理資料時需要先將資料加載到記憶體,表中讀取某些記錄時,
InnoDB存盤引擎不需要一條一條的把記錄從磁盤上讀出來,InnoDB采取的方式是:將資料劃分為若干個頁,以 頁作為磁盤和記憶體之間互動的基本單位,InnoDB中頁的大小一般為 16 KB,也就是說,當需要從磁盤中讀資料時每一次最少將從磁盤中讀取16KB的內容到記憶體中,每一次最少也會把記憶體中的16KB內容寫到磁盤中,

INNODB資料頁結構

頁是InnoDB管理存盤空間的基本單位,一個頁的大小默認是16KB,

SHOW GLOBAL STATUS like 'Innodb_page_size';

頁結構:

在這里插入圖片描述
在這里插入圖片描述

INNODB行格式

一行記錄可以以不同的格式存在InnoDB中,行格式分別是Compact、Redundant、Dynamic和Compressed行格式,
我們可以在創建或修改表的陳述句中指定行格式:

CREATE TABLE 表名 (列的資訊) ROW_FORMAT=行格式名稱
ALTER TABLE 表名 ROW_FORMAT=行格式名稱

COMPACT行格式
在這里插入圖片描述

記錄的額外資訊

這部分資訊是服務器為了描述這條記錄而不得不額外添加的一些資訊,這些額外資訊分為3類,分別是:

  • 變長欄位長度串列
  • NULL值串列
  • 記錄頭資訊

變長欄位長度串列

MySQL支持一些變長的資料型別,比如VARCHAR(M)、VARBINARY(M)、TEXT型別,BLOB型別,這些資料型別 修飾列稱為變長欄位,變長欄位中存盤多少位元組的資料不是固定的,所以我們在存盤真實資料的時候需要順便把這些資料占用的位元組數也存起來,在Compact行格式中,把所有變長欄位的真實資料占用的位元組長度都存放在記錄的開頭部位,從而形成一個變長欄位長度串列,

CHAR是一種固定長度的型別,VARCHAR則是一種可變長度的型別, VARCHAR(M),M代表最大能存多少個字符,(
MySQL5.0.3以前是位元組,以后就是字符)

NTLL值串列

Compact行格式會把可以為NULL的列統一管理起來,存一個標記為在NULL值串列中,如果表中沒有允許存盤
NULL 的列,則 NULL值串列也不存在了,

  • 二進制位的值為1時,代表該列的值為NULL,

  • 二進制位的值為0時,代表該列的值不為NULL,

記錄頭資訊

除了變長欄位長度串列、NULL值串列之外,還有一個用于描述記錄的記錄頭資訊,它是由固定的5個位元組組成,
5個位元組也就是40個二進制位,不同的位代表不同的意思,如圖:
在這里插入圖片描述

記錄的真實資料

在這里插入圖片描述

實際上這幾個列的真正名稱其實是:DB_ROW_ID、DB_TRX_ID、DB_ROLL_PTR,

一個表沒有手動定義主鍵,則會選取一個Unique鍵作為主鍵,如果連Unique鍵都沒有定義的話,則會為表默認添加一個名為row_id的隱藏列作為主鍵,所以row_id是在沒有自定義主鍵以及Unique鍵的情況下才會存在的,

行溢位資料

VARCHAR(M)型別的列最多可以占用65535個位元組,其中的M代表該型別最多存盤的字符數量,如果我們使用
ascii字符集的話,一個字符就代表一個位元組,我們看看VARCHAR(65535)是否可用:

mysql> CREATE TABLE varchar_size_demo(
-> c VARCHAR(65535)
-> ) CHARSET=ascii ROW_FORMAT=Compact;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type,
not counting BLOBs, is 65535. This includes storage overhead, check the manual. You
have to change some columns to TEXT or BLOBs
mysql>

報錯資訊表達的意思是:MySQL對一條記錄占用的最大存盤空間是有限制的,除BLOB或者TEXT型別的列之外, 其他所有的列(不包括隱藏列和記錄頭資訊)占用的位元組長度加起來不能超過65535個位元組,這個65535個位元組 除了列本身的資料之外,還包括一些其他的資料,比如說我們為了存盤一個VARCHAR(M)型別的列,其實需要占用3部分存盤空間:

  1. 真實資料
  2. 變長欄位真實資料的長度
  3. NULL值標識

如果該VARCHAR型別的列沒有NOT NULL屬性,那最多只能存盤65532個位元組的資料,因為變長欄位的長度占用
2個位元組,NULL值標識需要占用1個位元組,

mysql> CREATE TABLE varchar_size_demo(
-> c VARCHAR(65532)
-> ) CHARSET=ascii ROW_FORMAT=Compact;
Query OK, 0 rows affected (0.02 sec)

CREATE TABLE varchar_size_demo(
c VARCHAR(65533) not null
) CHARSET=ascii ROW_FORMAT=Compact;
Query OK, 0 rows affected (0.02 sec)

記錄中的資料太多產生的溢位

一個頁的大小一般是16KB,也就是16384位元組,而一個VARCHAR(M)型別的列就最多可以存盤65533個位元組,這樣就可能出現一個頁存放不了一條記錄,
在Compact和Reduntant行格式中,對于占用存盤空間非常大的列,在記錄的真實資料處只會存盤該列的一部分 資料,把剩余的資料分散存盤在幾個其他的頁中,然后記錄的真實資料處用20個位元組存盤指向這些頁的地址(當然這20個位元組中還包括這些分散在其他頁面中的資料的占用的位元組數),從而可以找到剩余資料所在的頁,

Dynamic和Compressed行格式

這兩種行格式類似于COMPACT行格式,只不過在處理行溢位資料時有點兒分歧,它們不會在記錄的真實資料處存盤一部分資料,而是把所有的資料都存盤到其他頁面中,只在記錄的真實資料處存盤其他頁面的地址,另外,
Compressed行格式會采用壓縮演算法對頁面進行壓縮,

索引

索引的產生程序可以看下我講過的教程視頻:MYSQL底層原理教程全集

聚簇索引

聚簇索引的特點:

  1. 按主鍵值的大小進行記錄和頁的排序:

    • 資料頁(葉子節點)里的記錄是按照主鍵值從小到大排序的一個單向鏈表,
    • 資料頁(葉子節點)之間也是是按照主鍵值從小到大排序的一個雙向鏈表,
    • B+樹中同一個層的頁目錄也是按照主鍵值從小到大排序的一個雙向鏈表,
  2. B+樹的葉子節點存盤的是完整的用戶記錄,就是指這個記錄中存盤了所有列的值(包括隱藏列),

具有這兩種特性的B+樹稱為聚簇索引,所有完整的用戶記錄都存放在這個聚簇索引的葉子節點處,這種聚簇索引并不需要我們在MySQL陳述句中顯式的使用INDEX陳述句去創建,InnoDB存盤引擎會自動的為我們創建聚簇索引, 在InnoDB存盤引擎中,聚簇索引就是資料的存盤方式(所有的用戶記錄都存盤在了葉子節點),也就是所謂的索引即資料,資料即索引,

二級索引(復制索引)

聚簇索引只能在搜索條件是主鍵值時才能發揮作用,因為B+樹中的資料都是按照主鍵進行排序的,當我們想以別的列作為搜索條件時我們可以多建幾棵B+樹,不同的B+樹中的資料采用不同的排序規則,
二級索引與聚簇索引有幾處不同:

  1. 按指定的索引列的值來進行排序
  2. 葉子節點存盤的不是完整的用戶記錄,而只是索引列+主鍵,
  3. 目錄項記錄中不是主鍵+頁號,變成了索引列+頁號,
  4. 在對二級索引進行查找資料時,需要根據主鍵值去聚簇索引中再查找一遍完整的用戶記錄,這個程序叫做回表

聯合索引

以多個列的大小為排序規則建立的B+樹稱為聯合索引,本質上也是一個二級索引,

目錄項紀錄的唯一性

我們需要保證在B+樹的同一層內節點的目錄項記錄除頁號這個欄位以外是唯一的,所以對于二級索引的內節點的目錄項記錄的內容實際上是由三個部分構成的:

  • 索引列的值
  • 主鍵值
  • 頁號

B+樹索引總結

  1. 每個索引都對應一棵B+樹,用戶記錄都存盤在B+樹的葉子節點,所有目錄記錄都存盤在非葉子節點,
  2. InnoDB存盤引擎會自動為主鍵(如果沒有它會自動幫我們添加)建立聚簇索引,聚簇索引的葉子節點包含完整的用戶記錄,
  3. 可以為指定的列建立二級索引,二級索引的葉子節點包含的用戶記錄由索引列 + 主鍵組成,所以如果想通過二級索引來查找完整的用戶記錄的話,需要通過回表操作,也就是在通過二級索引找到主鍵值之后再到聚簇索引中查找完整的用戶記錄,
  4. B+樹中每層節點都是按照索引列值從小到大的順序排序而組成了雙向鏈表,而且每個頁內的記錄(不論 是用戶記錄還是目錄項記錄)都是按照索引列的值從小到大的順序而形成了一個單鏈表,如果是聯合索引的話,則頁面和記錄先按照聯合索引前邊的列排序,如果該列值相同,再按照聯合索引后邊的列排序,
  5. 通過索引查找記錄是從B+樹的根節點開始,一層一層向下搜索,由于每個頁面都按照索引列的值建立了頁目錄,所以在這些頁面中的查找非常快,

以上就是我總結的MySQL索引底層技術了,相信如果你理解透徹之后,一般的面試官是根本難不住你的!最后再為大家分享一波底層架構師資料

資料領取方式:點擊這里【暗號:CSDN】

在這里插入圖片描述
在這里插入圖片描述

資料領取方式:點擊這里【暗號:CSDN】

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/202559.html

標籤:其他

上一篇:完美收官!位元組4面斬下2-2Offer,入職就是30K16薪

下一篇:從原始碼的角度看Java中動態sql技術細節,來闡述#{name}和${name}的區別?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more