如果你是后台开发者,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;
*************************** . row ***************************
Type: InnoDB
Name:
Status:
=====================================
-- :: 0xf44 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: srv_active, srv_shutdown, srv_idle
srv_master_thread log flush and writes:
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count
OS WAIT ARRAY INFO: signal count
RW-shared spins , rounds , OS waits
RW-excl spins , rounds , OS waits
RW-sx spins , rounds , OS waits
Spin rounds per wait: 0.00 RW-shared, 35.33 RW-excl, 0.00 RW-sx
------------
TRANSACTIONS
------------
Trx id counter
Purge done for trx's n:o < 2591 undo n:o < 0 state: running but idle
History list length
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION , not started
lock struct(s), heap size , row lock(s)
--------
FILE I/O
--------
I/O thread state: wait Windows aio (insert buffer thread)
I/O thread state: wait Windows aio (log thread)
I/O thread state: wait Windows aio (read thread)
I/O thread state: wait Windows aio (read thread)
I/O thread state: wait Windows aio (read thread)
I/O thread state: wait Windows aio (read thread)
I/O thread state: wait Windows aio (write thread)
I/O thread state: wait Windows aio (write thread)
I/O thread state: wait Windows aio (write thread)
I/O thread state: wait Windows aio (write thread)
Pending normal aio reads: [, , , ] , aio writes: [, , , ] ,
ibuf aio reads:, log i/o's:, sync i/o's:
Pending flushes (fsync) log: ; buffer pool:
OS file reads, OS file writes, OS fsyncs
0.00 reads/s, avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size , free list len , seg size , merges
merged operations:
insert , delete mark , delete
discarded operations:
insert , delete mark , delete
Hash table size , node heap has buffer(s)
Hash table size , node heap has buffer(s)
Hash table size , node heap has buffer(s)
Hash table size , node heap has buffer(s)
Hash table size , node heap has buffer(s)
Hash table size , node heap has buffer(s)
Hash table size , node heap has buffer(s)
Hash table size , node heap has buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s
---
LOG
---
Log sequence number
Log buffer assigned up to
Log buffer completed up to
Log written up to
Log flushed up to
Added dirty pages up to
Pages flushed up to
Last checkpoint at
log i/o's done, 0.00 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated
Dictionary memory allocated
Buffer pool size
Free buffers
Database pages
Old database pages
Modified db pages
Pending reads
Pending writes: LRU , flush list , single page
Pages made young , not young
0.00 youngs/s, 0.00 non-youngs/s
Pages read , created , written
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: , unzip_LRU len:
I/O sum[]:cur[], unzip sum[]:cur[]
--------------
ROW OPERATIONS
--------------
queries inside InnoDB, queries in queue
read views open inside InnoDB
Process ID=, Main thread ID=000000000000093C , state=sleeping
Number of rows inserted , updated , deleted , read
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================ row in set (0.00 sec) ERROR:
No query specified mysql>
欢迎各软件开发朋友入群482614369交流,分享干货~~
如果你是后台开发者,InnoDB的小秘密,你应该知道的更多相关文章
- 推荐5 款WordPress主题后台选项开发框架
在开发WordPress 主题的时候,借用成熟的WordPress 主题后台选项开发框架可以为我们省下不少功夫.相信你接触过不少国人做的所谓“原创”主题,一看后台都是千篇一律的界面(连CSS 都懒得改 ...
- 后端开发者的Vue学习之路(一)
目录 前言: iview组件库示例 element组件库示例 Vue的介绍 兼容性: 学习Vue需要的前置知识: MVVM模型 补充: 安装/导入 导入Vue 安装 两种方式的区别: HelloWor ...
- IOS后台运行 之 后台播放音乐
iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了.如果音频操作是用苹果官方的AVFoundation.framework实现,像用AvAudioPlayer,Av ...
- 如若已在管理后台更新域名配置,请刷新项目配置后重新编译项目,操作路径:“项目-域名信息” http://www.mysite.com 不在以下 request 合法域名列表中
报错如图 报错文字如下: 如若已在管理后台更新域名配置,请刷新项目配置后重新编译项目,操作路径:“项目-域名信息” http://www.mysite.net 不在以下 request 合法域名列表中 ...
- .NET Core 小程序开发零基础系列(1)——开发者启用并牵手成功
最近几个月本人与团队一直与小程序打交道,对小程序的实战开发算比较熟悉,也因一些朋友经常问我各种小程序问题,无不能一一回答,想了很久,决定还是空余时间来写写文章吧,偶尔发现一个人安静的时候写文章特爽 ...
- Mysql数据库的使用总结之Innodb简介
最近在对开发的软件的服务器部分制作安装包,但服务器部分需要有mysql数据库的支持.因此,采用免安装版的mysql策略:将mysql数据库需要的文件在安装程序中进行设置和打包即可.但也遇到了很多问题 ...
- Mysql数据库的使用总结之Innodb简介(一)
最近在对开发的软件的服务器部分制作安装包,但服务器部分需要有mysql数据库的支持.因此,采用免安装版的mysql策略:将mysql数据库需要的文件在安装程序中进行设置和打包即可.但也遇到了很多 ...
- Twitter Bootstrap深受开发者喜爱的11大理由
Bootstrap,作为创新技术框架,使开发者.设计者更容易.更快捷.更出色地完成网站及应用的搭建工作.如果你还没有使用Twitter Bootstrap,建议你去了解一下.Bootstrap为开发者 ...
- 成为VR开发者的六个基本问题
2016-05-31 小小CTO 未来CTO 我常被问起能否提供更多的建议,帮助其他人进入这个行业,或是做VR开发人员该怎么赚钱.我很难具体回答,因为每个人的情况都很不一样.不过还是有一些建议适用于想 ...
随机推荐
- 虚拟机之 Wordpress博客搭建
WordPress博客需要LAMP环境,--- LAMP 官网:https://cn.wordpress.org/ wordpress-4.4.1版本环境要求是: php 5.2.4或以上 mysq ...
- html-select
<html><head> <title>select选择标签</title> <meta charset="UTF-8"> ...
- java中的报错机制
异常:Exception,程序运行过程中因为一些原因,使得程序无法运行下去 注意:在程序能够运行起来的情况,不是程序编译通不过 举例:读文件,点击一个按钮,文件不存在:访问数据库服务器,数据库服务器停 ...
- ms project设置行高
1.取消某列的自动换行右击“任务名称”——自动换行 2.全选所有任务点击左上角单元格 3.设置所有行的行高点击任意行最左边单元格的下边框,向上拖放 4.ok
- linux 压力测试工具 webbench
webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.编译安装: 1. wget htt ...
- web优化
一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单.随着互联网业务的不断丰富,网站相关的技术经过 ...
- LINUX下用C语言历遍目录 C语言列出目录 dirent.h在C/C++中的使用
LINUX下历遍目录的方法一般是这样的打开目录->读取->关闭目录相关函数是opendir -> readdir -> closedir #include <dirent ...
- wdcp挂载数据盘为WWW以及之后出现的各种问题解决方法
昨天晚上突然有客户反映服务器访问不了,经检查后是因为磁盘满了! 购买阿里云的ECS选择linux系统的时候会赠送20G的系统盘,通常来讲自己用的话基本够了,但是我们作为网络公司,安装了一个WDCP后给 ...
- Java文件执行顺序总结
类执行顺序 一个java文件的执行过程: 编译:加载的类,加载的时候对类中的资源进行编译,首先是静态成员变量,静态方法等,如果有相应操作,就会进行相应的操作, 并且这个Static修饰后的静态成员变量 ...
- linux信号基本概念及如何产生信号
linux信号基本概念及如何产生信号 摘自:https://blog.csdn.net/summy_j/article/details/73199069 2017年06月14日 09:34:21 阅读 ...