目次
MySQL内核InnoDB存储引擎(卷1)
目录
概览
基本数据结构和算法
同步机制
重做日志
mini-transaction(mtr)
存储管理
记录
索引页
B+树索引
Insert Buffer
缓冲池
事务处理
数据字典
服务管理
ホームページ データベース mysql チュートリアル MySQL内核InnoDB存储引擎(卷1)笔记_MySQL

MySQL内核InnoDB存储引擎(卷1)笔记_MySQL

Jun 01, 2016 pm 01:04 PM
カーネル エンジン ノート

MySQL内核InnoDB存储引擎(卷1)

目录

  • 1 概览
  • 2 基本数据结构和算法
  • 3 同步机制
  • 4 重做日志
  • 5 mini-transaction(mtr)
  • 6 存储管理
  • 7 记录
  • 8 索引页
  • 9 锁
  • 10 B+树索引
  • 11 Insert Buffer
  • 12 缓冲池
  • 13 事务处理
  • 14 数据字典
  • 15 服务管理

    概览

    基本数据结构和算法

    同步机制

    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_logfileredo日志块(512B-12-8) 和磁盘扇区大小一样,保证原子性,不需要double write? 重做日志组*组提交:fsync -> log_flush_up_to 会对最后一个日志块进行复制恢复:recovery_from_checkpoint_start 表空间第一个页头部的FIL_PAGE_FILE_FLUSH_LSN记录了数据库关闭时最后刷新页的LSNrecv_parse_or_apply_log_rec_bodyrecv_add_to_hash_tablerecv_recover_pagerecv_read_in_area 判断页所在相邻的32个页?

    mini-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

    数据字典

    服务管理

  • このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    小紅書メモを削除する方法 小紅書メモを削除する方法 Mar 21, 2024 pm 08:12 PM

    小紅書メモを削除するにはどうすればよいですか? メモは小紅書アプリで編集できます。ほとんどのユーザーは小紅書メモの削除方法を知りません。次に、エディターがユーザーに小紅書メモの削除方法に関する写真とテキストを提供します。チュートリアル、興味のあるユーザーが来て、それを受講してください見てください!小紅書使い方チュートリアル 小紅書メモの削除方法 1. まず小紅書アプリを開いてメインページに入り、右下隅の[自分]を選択して特別エリアに入ります; 2. 次に、マイエリアで、表示されているメモページをクリックします下の図で、削除したいメモを選択します; 3. メモページに入り、右上隅の [3 つの点] をクリックします; 4. 最後に、下部に機能バーが展開され、[削除] をクリックして完了します。

    小紅書に関する削除されたメモは復元できますか? 小紅書に関する削除されたメモは復元できますか? Oct 31, 2023 pm 05:36 PM

    小紅書から削除されたメモは復元できません。小紅書は知識共有とショッピングのプラットフォームとして、ユーザーにメモを記録し、役立つ情報を収集する機能を提供します。小紅書氏の公式声明によると、削除されたメモは復元できないとのこと。小紅書プラットフォームには、専用のノート回復機能はありません。これは、Xiaohongshu でメモが削除されると、誤って削除されたか、その他の理由であったとしても、プラットフォームから削除されたコンテンツを取得することは通常不可能であることを意味します。特別な状況が発生した場合は、Xiaohongshu のカスタマー サービス チームに連絡して、問題の解決に協力できるかどうかを確認してください。

    小紅書に投稿したメモが見つからない場合はどうすればよいですか?送信したばかりのメモが見つからない理由は何ですか? 小紅書に投稿したメモが見つからない場合はどうすればよいですか?送信したばかりのメモが見つからない理由は何ですか? Mar 21, 2024 pm 09:30 PM

    小紅書のユーザーとして、私たちは皆、公開されたノートが突然消えてしまう状況に遭遇したことがありますが、間違いなく混乱し、心配しています。この場合、どうすればよいでしょうか?この記事では、「小紅書が公開したメモが見つからない場合の対処方法」というテーマに焦点を当て、詳細な回答を提供します。 1. 小紅書が発行したメモが紛失した場合はどうすればよいですか?まず、パニックにならないでください。メモがなくなっていることに気づいた場合は、パニックに陥らず、落ち着いて行動することが重要です。これは、プラットフォームのシステム障害または操作エラーが原因である可能性があります。リリース記録の確認も簡単です。小紅書アプリを開き、「自分」→「公開」→「すべての出版物」をクリックするだけで、自分の出版記録を表示できます。ここでは、以前に公開されたノートを簡単に見つけることができます。 3.再投稿。見つかったら

    最新のiOS 17システムでiPhoneにApple Notesを接続する方法 最新のiOS 17システムでiPhoneにApple Notesを接続する方法 Sep 22, 2023 pm 05:01 PM

    リンクの追加機能を使用して iPhone で AppleNotes をリンクします。注: iOS17 がインストールされている場合、iPhone 上で Apple Notes 間のリンクを作成することができます。 iPhone でメモ アプリを開きます。次に、リンクを追加するメモを開きます。新しいメモを作成することもできます。画面上の任意の場所をクリックします。メニューが表示されます。右側の矢印をクリックして、「リンクの追加」オプションを表示します。クリックして。ここで、メモの名前または Web ページの URL を入力できます。次に、右上隅の「完了」をクリックすると、追加されたリンクがメモに表示されます。単語にリンクを追加したい場合は、単語をダブルクリックして選択し、「リンクを追加」を選択して、 を押します。

    Ubuntu 22.04 に Linux カーネルをインストールする方法 詳細なチュートリアル! Ubuntu 22.04 に Linux カーネルをインストールする方法 詳細なチュートリアル! Mar 01, 2024 pm 10:34 PM

    Linux カーネルを Ubuntu22.04 にインストールするには、次の手順に従います。 システムを更新します。 まず、Ubuntu システムが最新であることを確認し、次のコマンドを実行してシステム パッケージを更新します。 sudoaptupdatesudoaptupgrade カーネル ファイルをダウンロードします。公式 Linux カーネル Web サイト () から必要なカーネル バージョンをダウンロードします。安定したバージョンを選択し、ソース コード ファイル (.tar.gz または .tar.xz 拡張子付き) をダウンロードします。例: wget ファイルを解凍します。次のコマンドを使用して、ダウンロードしたカーネル ソース コード ファイルを解凍します: tar-xflinux-5.14 .tar.xz ビルドの依存関係をインストールする: カーネルのビルドに必要なツールと依存関係をインストールします。実行する

    小紅書でノートに商品リンクを追加する方法 小紅書でノートに商品リンクを追加するチュートリアル 小紅書でノートに商品リンクを追加する方法 小紅書でノートに商品リンクを追加するチュートリアル Mar 12, 2024 am 10:40 AM

    小紅書でメモに商品リンクを追加するにはどうすればよいですか?小紅書アプリでは、ユーザーはさまざまなコンテンツを閲覧できるだけでなく、ショッピングもできるため、このアプリにはショッピングのおすすめや良い商品の共有に関するコンテンツがたくさんあります。このアプリでは、ショッピング体験を共有したり、協力してくれる販売者を見つけたり、メモにリンクを追加したりすることもできます。便利なだけでなく、専門家がいくつかの機能を備えているため、多くの人がこのアプリをショッピングに使用したいと考えています。興味深いコンテンツを閲覧して、自分に合った衣料品があるかどうかを確認できます。ノートに商品リンクを追加する方法を見てみましょう! 小紅書ノートに商品リンクを追加する方法 携帯電話のデスクトップでアプリを開きます。アプリのホームページをクリックします

    Linux カーネルの起動シーケンスを変更する Linux カーネルの起動シーケンスを変更する Feb 23, 2024 pm 10:22 PM

    Linux のカーネル起動シーケンスの変更 1. RHEL6/CentOS6 のカーネル起動シーケンスの変更 /etc/grub.conf ファイルを確認して、システムのカーネルの状況を確認します。ドキュメントによると、システムには 2.6.32-573.18.1.el6.x86_64 と 2.6.32-431.23.3.el6.x86_64 という 2 つのカーネル バージョンがあります。カーネルのバージョンは上から下にリストされています。 grub.conf ファイルでは、デフォルトのパラメータを調整することで、システムの起動時に使用するカーネルのバージョンを決定できます。デフォルト値は 0 で、システムが最新のカーネル バージョンを起動することを意味します。値 0 は、grub.conf ファイルにリストされている最初のコンテンツに対応します。

    小紅書でメモのチュートリアルを公開するにはどうすればよいですか?メモを投稿することでユーザーをブロックできますか? 小紅書でメモのチュートリアルを公開するにはどうすればよいですか?メモを投稿することでユーザーをブロックできますか? Mar 25, 2024 pm 03:20 PM

    小紅書はライフスタイル共有プラットフォームとして、食、旅行、美容などさまざまな分野のメモをカバーしています。多くのユーザーは小紅書でメモを共有したいと思っていますが、その方法がわかりません。この記事では、Xiaohongshu にメモを投稿するプロセスを詳しく説明し、プラットフォーム上で特定のユーザーをブロックする方法を検討します。 1.小紅書でメモのチュートリアルを公開するにはどうすればよいですか? 1. 登録とログイン: まず、携帯電話に小紅書アプリをダウンロードし、登録とログインを完了する必要があります。パーソナルセンターに個人情報を記入することは非常に重要です。アバターをアップロードし、ニックネームや自己紹介を記入することで、他のユーザーがあなたの情報を理解しやすくなり、メモに注意を向けやすくなります。 3. 公開チャネルを選択します。ホームページの下部にある [メモを送信] ボタンをクリックし、公開するチャネルを選択します。

    See all articles