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:47 ? 次閱讀

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

1.1 概念:

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

Page:Buffer Pool的最小單位;

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

Flush list:臟頁鏈表;

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

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

圖片

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

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

圖片

1.2.1 頁面裝載的邏輯如圖:

圖片

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

1.2.2 頁面淘汰

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

1.2.3 位置移動

圖片

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

Midpoint:指向5/8位置

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

移動時機(jī):

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

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

1、基本概念:

1.1 事務(wù)特性:

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

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

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

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

1.2 并發(fā)問題:

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

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

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

1.3 隔離級別

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

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

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

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

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

2.1 MVCC

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

圖片

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ù)

圖片

寫入流程:

圖片

刷盤時機(jī):

innodb_flush_log_at_trx_commit

圖片

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

3.1 索引使用技巧

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

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

覆蓋索引:二級索引存儲主鍵值更有利

索引排序:索引同時滿足查詢和排序

3.2 分庫分表

是否分表,建議單表不超過1KW

分表方式,取模:存儲均勻&訪問均勻,按時間:冷熱庫

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

3.3 使用建議

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

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

文本字段建議使用VARCHAR;

時間字段建議使用long;

bool字段建議使用tinyint;

枚舉字段建議使用tinyint;

交易金額建議使用long;

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

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

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

select * from t1 where id >1121 - 1 會使用索引

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

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

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

字符串索引使用前綴索引,前綴長度不超過10個字符;


聲明:本文內(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

    文章

    4314

    瀏覽量

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

    關(guān)注

    8

    文章

    3025

    瀏覽量

    74060
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    811

    瀏覽量

    26580
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    最有用的mysql問答

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

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

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

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

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

    MySQL中的redo log是什么

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

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

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

    MySQL5.6 InnoDB支持全文檢索

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

    剖析MySQL InnoDB存儲原理(上)

    一、MySQL記錄的存儲結(jié)構(gòu): 1、Page的結(jié)構(gòu),如下圖:
    的頭像 發(fā)表于 02-15 15:45 ?439次閱讀
    <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 ?734次閱讀