0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

剖析MySQL InnoDB存儲原理(上)

jf_78858299 ? 來源:老李說架構(gòu)之道 ? 作者:夢海飛翔 ? 2023-02-15 15:45 ? 次閱讀

一、MySQL記錄的存儲結(jié)構(gòu):

1、Page的結(jié)構(gòu),如下圖:

圖片

1.1 頁頭

記錄頁面的控制信息,共占56字節(jié),包括頁的左右兄弟頁面指針、頁面空間使用情況等。

1.2 虛記錄

最大虛記錄:比頁內(nèi)最大主鍵還大

最小虛記錄:比頁內(nèi)最小主鍵還小

1.3 記錄堆

行記錄存儲區(qū),分為有效記錄和已刪除記錄

1.4 自由空間鏈表

已刪除記錄組成的鏈表

1.5 未分配空間

頁面未使用的存儲空間;

2、Page頁內(nèi)記錄的維護(hù)

2.1 順序保證

邏輯連續(xù),如圖所示:

圖片

2.2 插入策略

為了提高內(nèi)存的利用率,減少內(nèi)存碎片化空洞,首先從自由空間鏈表中分配(已刪除的記錄鏈表),如果空間不夠再從未分配空間分配;

2.3 頁內(nèi)查詢

二分查找,首先從物理連續(xù)的solt(0~n)中查找所在的solt位,然后再從page邏輯鏈表中找到所對應(yīng)的記錄;如圖所示;

圖片

3、Page頁內(nèi)數(shù)據(jù)特性

3.1 PageSize的固定大小為16KB

3.2 每頁至少兩天記錄,單行最大為8KB

3.3 最多存儲10個大字段

數(shù)據(jù)段最大768 ->(768+20)*10<8K

超出部分存儲在溢出頁

3.4 VARCHAR

1或2個字節(jié)描述字符長度;

實(shí)際內(nèi)容存儲在長度字節(jié)之后;

VARCHAR(255) [一個字節(jié)]+內(nèi)容

VARCHAR(256) [兩個字節(jié)]+內(nèi)容

二、 InnoDB索引原理和優(yōu)化

1、索引的原理分析

1.1 聚簇索引

數(shù)據(jù)存儲在主鍵索引中,數(shù)據(jù)按主鍵順序存儲,如圖所示:

圖片

1.2 二級索引

除主鍵索引以外的索引,葉子中存儲主鍵值

一次查詢需要走兩遍查詢

主鍵大小會影響所有索引的大小,如圖所示:

圖片

1.3 聯(lián)合索引

Key由多個字段組成,最左匹配原則

一個索引只創(chuàng)建一棵樹按第一列排序

第一列相同按第二列排序

注意 :如果不是按照最左開始查找,無法使用索引,不能跳過中間列,某列使用范圍查詢后面的列不能使用索引。

2、索引的優(yōu)化分析

2.1 存儲空間

索引文件大小是由字段大小、頁內(nèi)節(jié)點(diǎn)數(shù)目、樹的層數(shù)

2.2 主鍵的選擇

自增主鍵,順序?qū)懭?,效率?/p>

隨機(jī)主鍵,結(jié)點(diǎn)分裂、數(shù)據(jù)移動

自增主鍵寫入磁盤利用率高,每次查詢走兩級索引

隨機(jī)主鍵寫入磁盤利用率低,每次查詢走兩級索引

業(yè)務(wù)主鍵:寫入查詢磁盤利用率都高,可以使用一級索引

聯(lián)合主鍵:影響索引大小,不易維護(hù),不建議使用

2.3 聯(lián)合主鍵

按索引區(qū)分度排序,并且覆蓋索引;

2.4 字符串索引

字符是按照字節(jié)對比的,設(shè)置的時候注意控制長度;

不支持開頭的%模糊查詢,只能全表掃描;

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 存儲
    +關(guān)注

    關(guān)注

    13

    文章

    4123

    瀏覽量

    85277
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    789

    瀏覽量

    26283
收藏 人收藏

    評論

    相關(guān)推薦

    深度剖析MySQL/InnoDB的并發(fā)控制和加鎖技術(shù)

    本文主要是針對MySQL/InnoDB的并發(fā)控制和加鎖技術(shù)做一個比較深入的剖析,并且對其中涉及到的重要的概念,如多版本并發(fā)控制(MVCC),臟讀(dirty read),幻讀(phantom
    的頭像 發(fā)表于 10-29 14:36 ?2066次閱讀
    深度<b class='flag-5'>剖析</b><b class='flag-5'>MySQL</b>/<b class='flag-5'>InnoDB</b>的并發(fā)控制和加鎖技術(shù)

    詳解Mysql數(shù)據(jù)庫InnoDB存儲引擎事務(wù)

    關(guān)于Mysql數(shù)據(jù)庫InnoDB存儲引擎事務(wù)的一點(diǎn)理解
    發(fā)表于 05-13 10:11

    InnoDB鎖的特點(diǎn)和狀態(tài)查詢

    MySQL探秘(五)InnoDB鎖的類型和狀態(tài)查詢
    發(fā)表于 08-07 11:45

    分布式MySQLInnoDB cluster

    分布式MySQL——InnoDB cluster和性能測試
    發(fā)表于 04-15 08:43

    MySQL存儲引擎簡析

    MySQL存儲引擎InnoDB??InnoDB存儲文件有兩個,后綴名分別是.frm和.idb,其中.frm是表的定義文件,而.idb是數(shù)
    發(fā)表于 09-06 06:07

    MySQL存儲引擎中MyISAM與InnoDB優(yōu)劣勢比較分析

    使用MySQL當(dāng)然會接觸到MySQL存儲引擎,在新建數(shù)據(jù)庫和新建數(shù)據(jù)表的時候都會看到。
    的頭像 發(fā)表于 07-18 16:00 ?2623次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>存儲</b>引擎中MyISAM與<b class='flag-5'>InnoDB</b>優(yōu)劣勢比較分析

    關(guān)于mysql存儲引擎你知道多少

    Mysql中用的最多的兩種存儲引擎就是MyISAM和InnDB,其中MyISAM是5.1版本之前的默認(rèn)存儲引擎,InnoDB是5.1版本之后的默認(rèn)
    發(fā)表于 08-23 10:52 ?806次閱讀

    最有用的mysql問答

    、壓縮、空間函數(shù)等,但是不支持事務(wù)和行級鎖,所以一般用于有大量查詢少量插入的場景來使用,而且myisam不支持外鍵,并且索引和數(shù)據(jù)是分開存儲的。 innodb是基于聚簇索引建立的,和myisam相反它支持事務(wù)、外鍵,并且通過MVCC來支持高并發(fā),索引和數(shù)據(jù)
    的頭像 發(fā)表于 09-30 17:43 ?1632次閱讀
    最有用的<b class='flag-5'>mysql</b>問答

    MySQL存儲引擎完成更新語句執(zhí)行的方法

    首先肯定是我們的系統(tǒng)通過一個數(shù)據(jù)庫連接發(fā)送到了MySQL,然后肯定會經(jīng)過SQL接口、解析器、優(yōu)化器、執(zhí)行器幾個環(huán)節(jié),解析SQL語句,生成執(zhí)行計(jì)劃,接著去由執(zhí)行器負(fù)責(zé)這個計(jì)劃的執(zhí)行,調(diào)用InnoDB
    的頭像 發(fā)表于 10-21 10:40 ?1976次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>存儲</b>引擎完成更新語句執(zhí)行的方法

    關(guān)于InnoDB的內(nèi)存結(jié)構(gòu)及原理詳解

    除此之外還聊了一下MySQLInnoDB的日志,和兩次寫,總的來說算是一個入門級別的介紹,這篇文章就來詳細(xì)介紹一下InnoDB的內(nèi)存結(jié)構(gòu)。
    的頭像 發(fā)表于 04-16 16:15 ?2709次閱讀
    關(guān)于<b class='flag-5'>InnoDB</b>的內(nèi)存結(jié)構(gòu)及原理詳解

    MySQL中的redo log是什么

    時,InnoDB存儲引擎會使用redo log恢復(fù)數(shù)據(jù),保證數(shù)據(jù)的持久性與完整性。 一篇中阿星講過,MySQL中數(shù)據(jù)是以頁為單位,你查詢一條
    的頭像 發(fā)表于 09-14 09:40 ?1951次閱讀

    innodb究竟是如何存數(shù)據(jù)的

    前言如果你使用過mysql數(shù)據(jù)庫,對它的存儲引擎:innodb,一定不會感到陌生。 眾所周知,在mysql5以前,默認(rèn)的存儲引擎是:mysl
    的頭像 發(fā)表于 10-09 15:41 ?1252次閱讀
    <b class='flag-5'>innodb</b>究竟是如何存數(shù)據(jù)的

    MySQL5.6 InnoDB支持全文檢索

    在早期的 MySQL 中,InnoDB 并不支持全文檢索技術(shù),從 MySQL 5.6 開始,InnoDB 開始支持全文檢索。
    的頭像 發(fā)表于 11-12 15:14 ?1245次閱讀

    剖析MySQL InnoDB存儲原理(下)

    一、InnoDB存儲引擎內(nèi)存管理 1.1 概念: Buffer Pool:預(yù)分配的內(nèi)存池; Page:Buffer Pool的最小單位; Free list:空閑Page組成的鏈表;
    的頭像 發(fā)表于 02-15 15:47 ?352次閱讀
    <b class='flag-5'>剖析</b><b class='flag-5'>MySQL</b> <b class='flag-5'>InnoDB</b><b class='flag-5'>存儲</b>原理(下)

    MySQL中的InnoDB是什么?

    有許多強(qiáng)大的MySQL存儲引擎可供我們使用,而InnoDB無疑是最受歡迎的存儲引擎之一。它高度可靠和高效,因此它成為5.5版本以后所有MySQL
    的頭像 發(fā)表于 04-13 09:09 ?649次閱讀