如果你是后台开发者,InnoDB的小秘密,你应该知道

Posted 萨尔奇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果你是后台开发者,InnoDB的小秘密,你应该知道相关的知识,希望对你有一定的参考价值。

InnoDB简述

InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。InnoDB支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。

当前InnoDB采用双轨制授权,一是GPL授权,另一是专有软件授权。

InnoDB支持下列特性:

  • SQL和ACID兼容的事务
  • 表空间
  • 外键
  • 全文搜索索引
  • 空间操作,遵循OpenGIS标准
  • 虚拟列

 InnoDB特性

 InnoDB具有以下详细特征

特性 支持否
b-tree树索引 支持
备份/时间点恢复 (在服务器中实现,而不支持在存储引擎中实现。) 支持
群集数据库支持 不支持
聚集索引 支持
压缩数据 支持
数据缓存 支持
加密数据 支持(通过加密功能在服务器中实现;在mysql 5.7及更高版本中,支持静态数据表空间加密。)
外键支持 支持
全文搜索索引 支持(在MySQL 5.6及更高版本中可以使用InnoDB对FULLTEXT索引的支持。)
地理空间数据类型支持 支持
地理空间索引支持 支持(在MySQL 5.7及更高版本中可以使用InnoDB对地理空间索引的支持。)
哈希索引 否(InnoDB在内部利用哈希索引来实现其自适应哈希索引功能。)
索引缓存 支持
锁定粒度
MVCC 支持
复制支持 (在服务器中实现,而不支持在存储引擎中实现。) 支持
存储限制 64TB
T-tree索引 不支持
事务 支持
更新数据字典的统计信息 支持

 InnoDB架构

下图是InnoDB存储引擎体系结构的内存和磁盘结构

Buffer Pool 缓冲池是主存储器中的一个区域,用于在访问时缓存表和索引数据。 缓冲池允许直接从内存处理常用数据,从而加快处理速度。 在专用服务器上,通常会将最多80%的物理内存分配给缓冲池。

为了提高大容量读取操作的效率,缓冲池被分成可以容纳多行的page。为了提高缓存管理的效率,缓冲池被实现为链接的page list。

Log Buffer 日志缓冲区是保存要写入磁盘上日志文件的数据的内存区域。 日志缓冲区大小由innodb_log_buffer_size变量定义。 默认大小为16MB。 日志缓冲区的内容会定期刷新到磁盘。

大型日志缓冲区使大型事务能够运行,而无需在事务提交之前将重做日志数据写入磁盘。

System Tablespace InnoDB系统表空间是doublewrite缓冲区和更改缓冲区的存储区域。 系统表空间还包含在系统表空间中创建的用户创建表的表和索引数据。 在以前的版本中,系统表空间包含InnoDB数据字典。 在MySQL 8.0中, InnoDB将元数据存储在MySQL数据字典中。

Doublewrite 缓冲区是位于系统表空间中的存储区域, InnoDB在页面写入数据文件中的正确位置之前写入从InnoDB缓冲池中刷新的页面。

File-Per-Table Tablespaces 以后每个InnoDB表都存储在自己的表空间数据文件。在File-Per-Table Tablespaces基础上,可以将表文件从一另服务器迁移到另一个服务器,或从一个服务器复制到另一个服务器,如从Windows服务器复制到Linux服务器。

使用FLUSH TABLES ... FOR EXPORT将InnoDB表从一个服务器实例复制到另一个服务器实例(持续关注后续课程介绍)

也可以使用复制文件的方式移动将.ibd文件和关联表从一个数据库移动到另一个数据库,然后执行RENAME TABLE db1.tbl_name TO db2.tbl_name ;

General Tablespaces   通用表空间是使用CREATE TABLESPACE语法创建的共享InnoDB表空间。

Undo Tablespaces 撤消表空间包含撤消日志,撤消日志是撤消日志记录的集合,其中包含有关如何撤消事务到聚簇索引记录的最新更改的信息。 撤消日志存在于撤消日志段中,这些日志段包含在回滚段中。

Temporary Tablespaces  InnoDB有会话临时表空间和全局临时表空间。当InnoDB配置为磁盘内部临时表的存储引擎时,会话临时表空间存储由优化程序创建的用户创建的临时表和内部临时表。全局临时表空间( ibtmp1 )存储用于对用户创建的临时表所做更改的回滚段。

Redo Log 重做日志是在崩溃恢复期间用于纠正由未完成事务写入的数据的基于磁盘的数据结构。 在正常操作期间,重做日志会对更改由SQL语句或低级API调用产生的表数据的请求进行编码。

Undo Log 撤消日志是与单个读写事务关联的撤消日志记录的集合。 撤消日志记录包含有关如何撤消事务到聚簇索引记录的最新更改的信息。 如果另一个事务需要将原始数据视为一致读取操作的一部分,则从撤消日志记录中检索未修改的数据。 撤消日志存在于撤消日志段中 ,这些日志段包含在回滚段中 。 回滚段驻留在撤消表空间和全局临时表空间中 。


InnoDB表的限制

一个表最多可包含1017列,虚拟生成列包含在此限制中。

索引 一个表最多可包含64个二级索引

表空间,表空间的大小和page大小有关

page size 表空间大小
4KB 16TB
8KB 32TB
16KB 648TB
32KB 128TB
64KB 256TB

一个表最多可以有多少行? 表在表空间里,表各字段大小*行数=表大小,表空间里各表大小之各不能大小表空间大小。


InnoDB引擎状态

使用SQL 【SHOW ENGINE INNODB STATUS\\G】可以 知道InnoDB引擎状态信息。

mysql> SHOW ENGINE INNODB STATUS\\G;
*************************** 1. row ***************************
  Type: InnoDB
  Name:
Status:
=====================================
2019-04-15 08:48:01 0xf44 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 43 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 6 srv_active, 0 srv_shutdown, 4557 srv_idle
srv_master_thread log flush and writes: 0
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 7
OS WAIT ARRAY INFO: signal count 5
RW-shared spins 0, rounds 0, OS waits 0
RW-excl spins 3, rounds 106, OS waits 3
RW-sx spins 0, rounds 0, OS waits 0
Spin rounds per wait: 0.00 RW-shared, 35.33 RW-excl, 0.00 RW-sx
------------
TRANSACTIONS
------------
Trx id counter 2592
Purge done for trx\'s n:o < 2591 undo n:o < 0 state: running but idle
History list length 9
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 281475306751792, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
--------
FILE I/O
--------
I/O thread 0 state: wait Windows aio (insert buffer thread)
I/O thread 1 state: wait Windows aio (log thread)
I/O thread 2 state: wait Windows aio (read thread)
I/O thread 3 state: wait Windows aio (read thread)
I/O thread 4 state: wait Windows aio (read thread)
I/O thread 5 state: wait Windows aio (read thread)
I/O thread 6 state: wait Windows aio (write thread)
I/O thread 7 state: wait Windows aio (write thread)
I/O thread 8 state: wait Windows aio (write thread)
I/O thread 9 state: wait Windows aio (write thread)
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
 ibuf aio reads:, log i/o\'s:, sync i/o\'s:
Pending flushes (fsync) log: 0; buffer pool: 0
854 OS file reads, 381 OS file writes, 100 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 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 1 buffer(s)
Hash table size 2267, node heap has 3 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s
---
LOG
---
Log sequence number          19117710
Log buffer assigned up to    19117710
Log buffer completed up to   19117710
Log written up to            19117710
Log flushed up to            19117710
Added dirty pages up to      19117710
Pages flushed up to          19117710
Last checkpoint at           19117710
64 log i/o\'s done, 0.00 log i/o\'s/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 8585216
Dictionary memory allocated 396496
Buffer pool size   512
Free buffers       252
Database pages     256
Old database pages 0
Modified db pages  0
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 831, created 154, written 265
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: 256, 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=1440, Main thread ID=000000000000093C , state=sleeping
Number of rows inserted 24, updated 335, deleted 6, read 4975
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================

1 row in set (0.00 sec)

ERROR:
No query specified

mysql>

 欢迎各软件开发朋友入群482614369 交流,分享干货~~

以上是关于如果你是后台开发者,InnoDB的小秘密,你应该知道的主要内容,如果未能解决你的问题,请参考以下文章

关于网站那些不得不说的小秘密

虚函数的小秘密

iOSSafari的小秘密你知道吗?

flask开发restful api

网站开发和PHP的小秘密!

利用"零宽字符"隐藏你的小秘密