MySQL内核InnoDB存储引擎(卷1)
目录
概览
基本数据结构和算法
同步机制
rw-lock/latch s-/x-:x-可递归,s-不可?;以spin获得,一段时间后进入wait array(信号量?) p38 若sync_primary_wait_array中1000个cell都已分配,则ut_error触发crash 当持有latch的线程释放latch后,调用sync_array_signal_object唤醒等待线程重做日志
p42 redo log原来保证事务的持久性(D),undo log用于回滚和MVCCinnodb_flush_log_at_trx_commit=0/1/2redo log VS. bin log 前者记录的是页的物理逻辑操作日志设计思想:物理日志记录页内的修改(old-new value),逻辑日志记录对表的操作(insert/delete) LSN(表示事务写入redo log的字节量?) 对‘检查点’,表示刷新到磁盘的位置?——不管怎么说,LSN有一种‘随时间单调变化’的性质 检查点:将缓冲池中的页刷新到磁盘 sharpfuzzy* redo日志的大小是固定的(3GB)->归档日志ib_logfilemini-transaction(mtr)
FIX rules:修改页之前需要持有该页的latchWAL 每个页需要有一个LSN?LSN溢出怎么办? Force-Log-at-Commitmtr_t mtr; mtr_start(&mtr); ... mtr_commit(&mtr); 提交时若mtr->modified==TRUE,先修改缓冲池中的页*1,然后释放log_sys->mutex(这是一个热点) *1 log_reserve_and_write_fast/log_write_slow 快速/慢速2个路径 更新多行记录时,MLOG_MULTI_REC_END存储管理
页:(space_id, offset) 16KB1 extent = 64 连续的page space header 段(segment) 每张用户表至少2个段:聚集索引(B+树)的叶子节点和非叶子节点段一个段最多可以管理32个独立的页,和若干区 表空间数据结构:fil_system/space/node_struct4个异步I/O线程:异步读、异步写、插入缓存、重做日志记录
物理记录 p102 用户记录的heap no总是从2开始 伪记录:Infimum/Supremum(感觉将像是双链表的first/last) p103 VARCHAR类型的NULL不占用磁盘空间,而CHAR NULL用0x00填充大记录:BLOB/TEXT(溢出页,extern属性) 逻辑记录 dtuple_struct,对大记录是big_rec_structB+树索引只定位页,页内记录需要二分扫描 mtype/prtype 行记录版本(MVCC只是列?):通过隐藏的事务ID列 read_view_struct: low/up_limit_idtrx_ids, n_trx_idscreator p114 函数read_view_sees_trx_id用来判断当前事务是否可以读记录的当前版本,不是,则row_sel_build_prev_vers_for_mysql索引页
Page Header 页内记录根据主键是逻辑顺序,不是物理顺序 Page Directory(定位记录在页内的位置) slot?offset的主键逆序记录 Page Cursor*锁
p136 理论上,隔离级别越低,事务请求的锁越少或保持锁的时间越短幻读:谓词锁 --> key-range locking --> next/previous-key lockingp138 意向锁:意味着事务希望在更细粒度上加锁 InnoDB是行级锁,不会阻止全表扫描以外的请求 lock_rec_struct = { space, page_no, n_bits } 所有锁对象通过kernel_mutex进行保护(又一个热点!) 优化:细粒度拆分? p144 LOCK_GAP(代表范围锁不包含端点)显式锁和隐式锁**(略)行锁的维护*(重点,略) 插入更新PURGE一致性的锁定读页的分裂页的合并 自增锁(atomic?)死锁*B+树索引
聚集 / 辅助分裂操作:btr_page_split_and_insert合并:btr_compress查找:btr_cur_search_to_nth_level p203 对唯一约束的键值,需要使用模式PAGE_CUR_GE,而不是LElatch_modecursor DML操作 乐观插入:btr_cur_optimistic_insert非主键更新(主要是列的大小会不会发生变化) btr_cur_optimistic_update --> btr_cur_pessimistic_update(例略) 主键更新 删除 持久游标 btr_pcur_struct自适应哈希索引*Insert Buffer
将多次插入合并为一次操作(提高了非唯一约束辅助索引的插入性能)p237 实现最为困难的在于对死锁的处理 页逻辑层次划分:非IB页、IB非bitmap页、bitmap页p241 异步I/O线程可能引起死锁问题 --> rw_lock_x_lock_move_ownership缓冲池
LRU、Free和Flush链表预读 p258 随机预读 要满足32个页中9个已经访问过且都是活跃的才可能触发 线性预读*逻辑预读 页的刷新 部分写问题(?) --> double write(存在于内存的表空间,大小为2MB,这意味着最多128页/次刷新)事务处理
分类:扁平、带保存点的扁平、链、嵌套、分布式事务系统段*doublewrite段*undo日志存储 一致性的非锁定读 p282 读取快照不需要加锁 undo日志实现:回滚段 + undo段 trx_undo_struct undo记录purge*rollback 7B roll_ptr隐藏列 {rseg_id(1), page_no(4), offset(2)}3个回滚类型:TRX_SIG_{TOTAL_ROLLBACK, ROLLBACK_TO_SAVEPT, ERROR_OCCURRED} commit数据字典
服务管理

InnoDBBufferPool通過緩存數據和索引頁來減少磁盤I/O,提升數據庫性能。其工作原理包括:1.數據讀取:從BufferPool中讀取數據;2.數據寫入:修改數據後寫入BufferPool並定期刷新到磁盤;3.緩存管理:使用LRU算法管理緩存頁;4.預讀機制:提前加載相鄰數據頁。通過調整BufferPool大小和使用多個實例,可以優化數據庫性能。

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

MySQL值得學習,因為它是強大的開源數據庫管理系統,適用於數據存儲、管理和分析。 1)MySQL是關係型數據庫,使用SQL操作數據,適合結構化數據管理。 2)SQL語言是與MySQL交互的關鍵,支持CRUD操作。 3)MySQL的工作原理包括客戶端/服務器架構、存儲引擎和查詢優化器。 4)基本用法包括創建數據庫和表,高級用法涉及使用JOIN連接表。 5)常見錯誤包括語法錯誤和權限問題,調試技巧包括檢查語法和使用EXPLAIN命令。 6)性能優化涉及使用索引、優化SQL語句和定期維護數據庫。

MySQL適合初學者學習數據庫技能。 1.安裝MySQL服務器和客戶端工具。 2.理解基本SQL查詢,如SELECT。 3.掌握數據操作:創建表、插入、更新、刪除數據。 4.學習高級技巧:子查詢和窗口函數。 5.調試和優化:檢查語法、使用索引、避免SELECT*,並使用LIMIT。

MySQL通過表結構和SQL查詢高效管理結構化數據,並通過外鍵實現表間關係。 1.創建表時定義數據格式和類型。 2.使用外鍵建立表間關係。 3.通過索引和查詢優化提高性能。 4.定期備份和監控數據庫確保數據安全和性能優化。

MySQL是一個開源的關係型數據庫管理系統,廣泛應用於Web開發。它的關鍵特性包括:1.支持多種存儲引擎,如InnoDB和MyISAM,適用於不同場景;2.提供主從復制功能,利於負載均衡和數據備份;3.通過查詢優化和索引使用提高查詢效率。

SQL用於與MySQL數據庫交互,實現數據的增、刪、改、查及數據庫設計。 1)SQL通過SELECT、INSERT、UPDATE、DELETE語句進行數據操作;2)使用CREATE、ALTER、DROP語句進行數據庫設計和管理;3)複雜查詢和數據分析通過SQL實現,提升業務決策效率。

MySQL的基本操作包括創建數據庫、表格,及使用SQL進行數據的CRUD操作。 1.創建數據庫:CREATEDATABASEmy_first_db;2.創建表格:CREATETABLEbooks(idINTAUTO_INCREMENTPRIMARYKEY,titleVARCHAR(100)NOTNULL,authorVARCHAR(100)NOTNULL,published_yearINT);3.插入數據:INSERTINTObooks(title,author,published_year)VA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

記事本++7.3.1
好用且免費的程式碼編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。