Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

innodb

MySQL 核心存储引擎,核心结构为 BTREE

❯ tree -d
.
|-- api         InnoDB Native API   
|-- arch        Common interface for redo log and dirty page archiver system
|-- btr         btree
|-- buf         The database buffer buf_pool
|-- clone       Innodb Clone Interface
|-- data        SQL data field and tuple
|-- ddl
|-- dict         Data dictionary system
|-- eval         SQL evaluator: evaluates simple data structures, like expressions, in a query graph
|-- fil          The low-level file system
|-- fsp          File space management
|-- fts          Full text search
|-- fut          File-based list utilities
|-- gis          InnoDB R-tree search interfaces
|-- ha           Hash storage.
|-- handler
|-- ibuf         Insert buffer
|-- include
|   `-- detail
|       |-- fil
|       |-- fts
|       `-- ut
|-- lob          Large object (LOB) storage
|-- lock
|-- log          redo log / undo log / ddl log
|-- mach         Utilities for converting data from the database file to the machine format.
|-- mem          The memory management
|-- mtr          Mini-transaction
|-- os
|-- page
|-- pars
|-- que          Query graph
|-- read         Cursor read
|-- rem          Record manager
|-- row
|-- srv
|-- sync
|-- trx
|-- usr
`-- ut

多写几个单词会死...

  • 核心是一个 btree,加上并发控制,事务,日志等机制

innodb相关文档

QS:

  • 怎么查询表中得隐藏列
  • 基于 redo undo log 怎么恢复数据
  • 代码结构杂乱无章,怎么拆分模块
  • 怎么获得具体的性能指标

btree

http://mysql.taobao.org/monthly/2025/03/03/

  • 表也是 btree,称为聚簇索引

    • 有主键得情况下,key是主键
    • 没有主键得情况下,key 是什么?
  • page 大小默认 16k,无法配置,压缩之后最小为 1024 字节

alt text

  • index 指向表的 value 是什么,类似 pg 的ctid 还是具体的值还是其他

并发控制

  • 基于 undo 的 lock + mvcc

    • 读写不阻塞
    • 写写的时候使用 lock 保证事务
      • 悲观锁
  • lock

  • mvcc

    • 快照
  • mtr

log

https://www.cnblogs.com/mengxinJ/p/14211427.html

  • redo log

    • 记录数据页面的变动,故障之后可以重放
    • pg 记录的是事务的数据的变动,故障恢复之后重放,和 redo 的区别在哪里
  • undo log

    • 为支持 mvcc
  • binlog

    • 记录所有语句的变动,用于数据同步,故障恢复等

故障恢复

初始化

  • innodb_init 填充 handlerton 结构体,handlerton 是存储引擎的核心接口,定义了存储引擎的基本操作,比如初始化、创建表、插入数据等。 当前 innodb 几乎都实现了 handlerton 的所有接口
    • 可能有的接口还是由于 innodb 而添加的,许多接口是 innodb 专用的
    • handlerton 是存储引擎的全局操作 ,和具体的表无关
    • 与表相关的操作是通过继承 handler 实现的,常用的操作例如读index,读表等

相关接口

并行支持

官方实际只支持 count,并没有其余的外部使用案例,我们当前还在 rapid load 的时候使用 具可以参考 row_mysql_parallel_select_count_star 和 LoadTableFromPrimaryTable

并行是 innodb 内部并行,通过注册函数可以把一部分工作下推到 innodb 中

当前提供主要为下面三个接口,

  • parallel_scan_init

    • 创建一个 scan ctx,所有线程公用,保存一些公共状态或者数据
  • parallel_scan

    • 实际执行,这里会接受几个回调函数,用于实际的执行需求
  • parallel_scan_end

    • 最后的清理工作

实际主要操作的是 Parallel_reader,可以参考 row_mysql_parallel_select_count_star ,这里是一个比较完整的可用的是例子

  • add_scan

    1. 注册 index,index 就是 btree,可以是实际的表,也可以是 索引
    2. 切分 index,划分reader的任务,每个reader负责一个子树
    3. 注册执行函数,也就是并行是需要具体执行的操作
  • run

    1. 启动线程,执行任务
    2. 底层会调用 traverse_recs 执行注册的函数,这里可以获得实际需要处理的数据 m_rec

上面的 innodb 提供的接口只是一个适配器,从 18年就添加的,但是到现在都没有实际的使用例子

sysbench

  • sysbench 测试
100W. 

sysbench --threads=16 --time=60 --report-interval=1 /usr/share/sysbench/oltp_common.lua --mysql-host=localhost \
--mysql-port=3306 --mysql-user=root  --mysql-socket=/tmp/mysql.sock --mysql-password=123456 \
--mysql-db=tpch --tables=4 --table-size=1000000 prepare


alter user 'root'@'localhost' identified by  '123456';

create database tpch;

3. 预埋数据(测试机执行) 200W
sysbench --db-driver=mysql --mysql-host=localhost --mysql-socket=/tmp/mysql.sock --mysql-port=3306 --mysql-db=tpch \
--mysql-user=root --mysql-password=123456 --table_size=1000000 --tables=4 --threads=32 \
--events=0 --report-interval=1 --time=60 --percentile=95  --mysql-ignore-errors=all oltp_read_only prepare

4. 跑性能(测试机执行):
sysbench --db-driver=mysql --mysql-host=localhost --mysql-socket=/tmp/mysql.sock --mysql-port=3306 --mysql-db=tpch \
--mysql-user=root --mysql-password=123456 --table_size=1000000 --tables=4 --threads=32 \
--events=0 --report-interval=1 --time=60 --percentile=95  --mysql-ignore-errors=all --range_selects=0 --skip-trx=1  oltp_read_write run


- oltp_read_only
SQL statistics:
    queries performed:
        read:                            5004920
        write:                           0
        other:                           0
        total:                           5004920
    transactions:                        500492 (8340.12 per sec.)
    queries:                             5004920 (83401.20 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          60.0087s
    total number of events:              500492

Latency (ms):
         min:                                    0.42
         avg:                                    3.83
         max:                                   53.58
         95th percentile:                        7.84
         sum:                              1919257.98

Threads fairness:
    events (avg/stddev):           15640.3750/199.46
    execution time (avg/stddev):   59.9768/0.00

- oltp_read_write
SQL statistics:
    queries performed:
        read:                            239600
        write:                           95823
        other:                           13
        total:                           335436
    transactions:                        23956  (398.81 per sec.)
    queries:                             335436 (5584.18 per sec.)
    ignored errors:                      4      (0.07 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          60.0680s
    total number of events:              23956

Latency (ms):
         min:                                   16.01
         avg:                                   80.18
         max:                                  558.66
         95th percentile:                      179.94
         sum:                              1920901.02

Threads fairness:
    events (avg/stddev):           748.6250/4.61
    execution time (avg/stddev):   60.0282/0.02