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

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

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

剖析MySQL InnoDB存儲(chǔ)原理(下)

jf_78858299 ? 來(lái)源:老李說(shuō)架構(gòu)之道 ? 作者:夢(mèng)海飛翔 ? 2023-02-15 15:47 ? 次閱讀

一、InnoDB存儲(chǔ)引擎內(nèi)存管理

1.1 概念:

Buffer Pool:預(yù)分配的內(nèi)存池;

Page:Buffer Pool的最小單位;

Free list:空閑Page組成的鏈表;

Flush list:臟頁(yè)鏈表;

Page hash 表:維護(hù)內(nèi)存Page和文件Page的映射關(guān)系;

這幾個(gè)概念關(guān)系,如圖所示:

圖片

1.2 內(nèi)存的淘汰算法:LRU

分為三部分:LRU_new、LRU_old、MidPoint。如下圖所描述:

圖片

1.2.1 頁(yè)面裝載的邏輯如圖:

圖片

數(shù)據(jù)從磁盤到內(nèi)存 > Free list中取 > LRU中淘汰 > LRU Flush

1.2.2 頁(yè)面淘汰

LRU鏈表中將第一個(gè)臟頁(yè)刷盤并“釋放”,放到Free list中。

1.2.3 位置移動(dòng)

圖片

innodb_old_blocks_time old區(qū)存活時(shí)間,大于此值,有機(jī)會(huì)進(jìn)入new區(qū)

Midpoint:指向5/8位置

為了減少移動(dòng)到次數(shù)和lock,思路訪問(wèn)時(shí)間 + 頻率,避免熱數(shù)據(jù)被移除,通過(guò)如下:freed_page_clock:Buffer Pool淘汰頁(yè)數(shù)

移動(dòng)時(shí)機(jī):

當(dāng)前freed_page_clock - 上次移動(dòng)到Header時(shí)freed_page_clock >LRU_new長(zhǎng)度1/4

2、MySQL事務(wù)管理機(jī)制原理分析

1、基本概念:

1.1 事務(wù)特性:

A(Atomicity原子性):全部成功或全部失敗

I(Isolation隔離性):并行事務(wù)之間互不干擾

D(Durability持久性):事務(wù)提交后,永久生效

C(Consistency一致性):通過(guò)AID保證

1.2 并發(fā)問(wèn)題:

臟讀(Drity Read):讀取到未提交的數(shù)據(jù)

不可重復(fù)讀(Non-repeatable read):兩次讀取結(jié)果不同

幻讀(Phantom Read):select 操作得到的結(jié)果所表征的數(shù)據(jù)狀態(tài)無(wú)法支撐后續(xù)的業(yè)務(wù)操作

1.3 隔離級(jí)別

Read Uncommitted(讀取未提交內(nèi)容):最低隔離級(jí)別,會(huì)讀取到其他事務(wù)未提交的數(shù)據(jù),臟讀;

Read Committed(讀取提交內(nèi)容):事務(wù)過(guò)程中可以讀取到其他事務(wù)已提交的數(shù)據(jù),不可重復(fù)讀;

Repeatable Read(可重復(fù)讀):每次讀取相同結(jié)果集,不管其他事務(wù)是否提交,幻讀;

Serializable(串行化):事務(wù)排隊(duì),隔離級(jí)別最高,性能最差;

2、事務(wù)實(shí)現(xiàn)原理

2.1 MVCC

Read View:活躍事務(wù)列表(還未提交的事務(wù)) 列表中最小事務(wù)ID(提交),列表中最大事務(wù)ID(未提交);具體可見性通過(guò)如下流程圖所示:

圖片

2.2 MVCC如何實(shí)現(xiàn)

undo log:實(shí)現(xiàn)數(shù)據(jù)多版本,回滾,提交即清理;

圖片

redo log:實(shí)現(xiàn)事務(wù)持久性,記錄修改,用于異?;謴?fù),循環(huán)寫文件;

Write Pos:寫入位置

Chick Point:刷盤位置

Chick Point -> Write Pos:待落盤數(shù)據(jù)

圖片

寫入流程:

圖片

刷盤時(shí)機(jī):

innodb_flush_log_at_trx_commit

圖片

3、MySQL使用及調(diào)優(yōu)實(shí)踐分析

3.1 索引使用技巧

聯(lián)合索引:優(yōu)于多列獨(dú)立索引

索引順序:選擇性高的在前面

覆蓋索引:二級(jí)索引存儲(chǔ)主鍵值更有利

索引排序:索引同時(shí)滿足查詢和排序

3.2 分庫(kù)分表

是否分表,建議單表不超過(guò)1KW

分表方式,取模:存儲(chǔ)均勻&訪問(wèn)均勻,按時(shí)間:冷熱庫(kù)

分庫(kù),按業(yè)務(wù)垂直分,水平查分多個(gè)庫(kù)

3.3 使用建議

數(shù)據(jù)庫(kù)字符集使用utf8mb4;

VARCHAR按實(shí)際需要分配長(zhǎng)度;

文本字段建議使用VARCHAR;

時(shí)間字段建議使用long;

bool字段建議使用tinyint;

枚舉字段建議使用tinyint;

交易金額建議使用long;

禁止使用“%”前導(dǎo)的查詢;

禁止在索引列進(jìn)行數(shù)學(xué)運(yùn)算,會(huì)導(dǎo)致索引失效;

select * from t1 where id+1 >1121 不會(huì)使用索引

select * from t1 where id >1121 - 1 會(huì)使用索引

表必須有主鍵,建議使用業(yè)務(wù)主鍵;

單張表中索引數(shù)量不超過(guò)5個(gè);

單個(gè)索引字段數(shù)不超過(guò)5個(gè);

字符串索引使用前綴索引,前綴長(zhǎng)度不超過(guò)10個(gè)字符;


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

    關(guān)注

    13

    文章

    4123

    瀏覽量

    85279
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2903

    瀏覽量

    73539
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    789

    瀏覽量

    26283
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    本文主要是針對(duì)MySQL/InnoDB的并發(fā)控制和加鎖技術(shù)做一個(gè)比較深入的剖析,并且對(duì)其中涉及到的重要的概念,如多版本并發(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ù)庫(kù)InnoDB存儲(chǔ)引擎事務(wù)

    關(guān)于Mysql數(shù)據(jù)庫(kù)InnoDB存儲(chǔ)引擎事務(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和性能測(cè)試
    發(fā)表于 04-15 08:43

    MySQL存儲(chǔ)引擎簡(jiǎn)析

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

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

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

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

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

    最有用的mysql問(wèn)答

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

    MySQL中的高級(jí)內(nèi)容詳解

    MySQL 進(jìn)階?。?! 本文思維導(dǎo)圖如下。 事務(wù)控制和鎖定語(yǔ)句 我們知道,MyISAM 和 MEMORY 存儲(chǔ)引擎支持表級(jí)鎖定(table-level locking),InnoDB 存儲(chǔ)
    的頭像 發(fā)表于 03-11 16:55 ?2126次閱讀
    <b class='flag-5'>MySQL</b>中的高級(jí)內(nèi)容詳解

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

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

    MySQL中的redo log是什么

    前言 說(shuō)到MySQL,有兩塊日志一定繞不開,一個(gè)是InnoDB存儲(chǔ)引擎的redo log(重做日志),另一個(gè)是MySQL Servce層的 binlog(歸檔日志)。 只要是數(shù)據(jù)更新操
    的頭像 發(fā)表于 09-14 09:40 ?1951次閱讀

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

    前言如果你使用過(guò)mysql數(shù)據(jù)庫(kù),對(duì)它的存儲(chǔ)引擎:innodb,一定不會(huì)感到陌生。 眾所周知,在mysql5以前,默認(rèn)的存儲(chǔ)引擎是: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存儲(chǔ)原理(上)

    一、MySQL記錄的存儲(chǔ)結(jié)構(gòu): 1、Page的結(jié)構(gòu),如下圖:
    的頭像 發(fā)表于 02-15 15:45 ?381次閱讀
    <b class='flag-5'>剖析</b><b class='flag-5'>MySQL</b> <b class='flag-5'>InnoDB</b><b class='flag-5'>存儲(chǔ)</b>原理(上)

    MySQL中的InnoDB是什么?

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