8.mysql InnoDB引擎

13 篇文章 0 订阅

理解innoDB引擎底层原理

3f888550e8b0480ab3a9f5b4469320e2.png

表空间 ->段 ->区->页-行

每个ibd都是一个表空间

78372b188d51405fa93793ea009e1341.png

948d52092b4b41928316d05f94a7e9fe.png

b92583e7977e4a1e9678894a6ecbe116.png

58bcb89e93564bb7877abcaadbed7538.png

4d55b7bb48b7470fba0d39bd14b18d83.png

fbb4de60b949469399e08d101bb0068a.png

d671c6e7cb4745edb616428f10020633.png

自适应hash

b0ba57f54bdb459785a52e2092fc84de.png

mysql> show variables like '%hash_index%';
+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| innodb_adaptive_hash_index       | ON    | -- 开启了hash索引
| innodb_adaptive_hash_index_parts | 8     |
+----------------------------------+-------+
2 rows in set (0.01 sec)

日志缓冲区

51b1d1b03d2b4f33a7b5116671dfa5e4.png

查看日志缓冲区的大小
mysql> show variables like '%log_buffer_size%%';
+------------------------+----------+
| Variable_name          | Value    |
+------------------------+----------+
| innodb_log_buffer_size | 16777216 |
+------------------------+----------+
1 row in set (0.00 sec)
查看日志缓冲区启动的时间
mysql> show variables like '%flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_timeout    | 1     |
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
2 rows in set (0.00 sec)

磁盘结构

7764ecad0295466ea9b2f011063470f3.png

On-Disk structures

044b9e7c80e343af9f96b2dba6df1c7a.png

系统表空间
mysql>  show variables like '%data_file_path%';
+----------------------------+------------------------+
| Variable_name              | Value                  |
+----------------------------+------------------------+
| innodb_data_file_path      | ibdata1:12M:autoextend | 系统表空间
| innodb_temp_data_file_path | ibtmp1:12M:autoextend  |
+----------------------------+------------------------+
2 rows in set (0.00 sec)

File-Per-table

独立表空间

fea334ea32654d3283411cace6938feb.png

每张表都会创建一个表空间 后缀是.ibd

mysql>  show variables like '%file_per_table%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)

通用表空间

5700ec38fa18498baa0869532ef64803.png

创建表空间

创建表空间
mysql> create tablespace ts_test add datafile 'mytest.ibd' engine = innodb;
Query OK, 0 rows affected (0.09 sec)
选择数据库创建一个表空间
mysql> use testit;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

^[[A^[[ADatabase changed
mysql> create table a(id int primary key auto_increment,name varchar(10)) engine =innodb tablespace ts_test;
Query OK, 0 rows affected (0.04 sec)

 
[root@localhost ~]# find / -name mytest.ibd
/var/lib/mysql/mytest.ibd

 

撤销表空间

6aa755f0e5df42d795ff186cc6d5a989.png

默认创建了两个

cdf6ab3f8c504f94a04e917c6d1fe072.png

临时表空间

d021e4340314485a86e1a09aeee949bd.png

双写缓冲区

ce6a849a7a104348a0c65b42324ac8c9.png

重做日志

12ff7d52b91d48c1adba928df4d4bd03.png

后台线程

ee127cfa798f42fd8444ecf6a664b39e.png

1.Master thread

c6f4c0d0bf8d4e349b11a83df3f18cde.png

2.IO Thread

fd6e4888753d400a9766639d793aa70f.png

FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
 ibuf aio reads:, log i/o's:
Pending flushes (fsync) log: 0; buffer pool: 0
2298 OS file reads, 2688 OS file writes, 1700 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
 insert 0, delete mark 0, delete 0
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 34679, node heap has 2 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 9 buffer(s)
Hash table size 34679, node heap has 1 buffer(s)
Hash table size 34679, node heap has 2 buffer(s)
Hash table size 34679, node heap has 1 buffer(s)
Hash table size 34679, node heap has 2 buffer(s)
Hash table size 34679, node heap has 1 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s
---
LOG
---
Log sequence number          442255604
Log buffer assigned up to    442255604
Log buffer completed up to   442255604
Log written up to            442255604
Log flushed up to            442255604
Added dirty pages up to      442255604
Pages flushed up to          442255604
Last checkpoint at           442255604
Log minimum file id is       134
Log maximum file id is       135
612 log i/o's done, 0.00 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 0
Dictionary memory allocated 728465
Buffer pool size   8192
Free buffers       5736
Database pages     2438
Old database pages 879
Modified db pages  0
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 556, not young 218
0.00 youngs/s, 0.00 non-youngs/s
Pages read 2257, created 263, written 1521
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 2438, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
0 read views open inside InnoDB
Process ID=1793, Main thread ID=140098721007360 , state=sleeping
Number of rows inserted 26, updated 8, deleted 0, read 209
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
Number of system rows inserted 206, updated 544, deleted 68, read 413198
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
 

3.Purge Thread

4a62244dcad74974b49ca44068ab7f74.png

4.Page Cleaner Thread

964c7be9928a4f7aaf533377ace148ca.png

a6358f41bbbc4e248eaa5cb26e3eb2fc.png

事务原理

ea29b53d98dc44a9bca6ea4515bb3c94.png

586d43a5699842d5a8648ae280743cf6.png

979675143ebb4a789c3b8f7dc463b4fb.png

34841fdfef40418188e2977182fcecf0.png

在redolog中会记录更新的数据 然后如果刷新错误 就把redolog刷新到磁盘中 然后如果数据同步到了磁盘中 就把ib_logfile给重新刷新

undo log

739b698cd173414b8163fa7f5e08a6bc.png

7dd0e3cc16624ddaa48e66ea9f767817.png

当前读 可以读到最新的版本

快照读

在事务中 第一次select 查询数据就会拍摄一个快照 当之后的查询都会使用第一次select查询的数据

1453ffbc3d1a4aec8ee4a58babf787fb.png

39af4af7c792469780f929d17282fd67.png

25a10f335b864c65876836ec2a72aabc.png

实现原理

47bb323714034fd1a6bf8c4f6694e64e.png

3c6ec0b6dbcb41fc806d6de276ee2ff2.png

事务2

5d792b804b144b0294e9f4ae42e98199.png

事务3

29d92930eefd48b98eed4f01085da119.png

事务4

c2bee27da4014de59dff40231f2af137.png

dbc3bf8cf34f4d7a91e01281ec126b1d.png

abb09ccb491b4a21b80ac86b27109aff.png

9b6512e0d0e44fcb83205a58551dc996.png

948d29d8321f4816ad173bc0f9bde12c.png

9963741c74e647599f4c4990d1c50ce9.pngba9d301f9db84fe0953c88913f437566.pngf6755cf09a96410ca671c76bf3007ea7.png

 

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值