如果你是后台开发者,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开发人员该怎么赚钱.我很难具体回答,因为每个人的情况都很不一样.不过还是有一些建议适用于想 ...
随机推荐
- IE回车的一个怪异行为
IE中在input中回车相当于提交form,会从dom中找最近的button标签触发click事件 <!DOCTYPE html> <html> <head> &l ...
- Eclipse oxygen安装中文包
help->install new software Eclipse software repository http://download.eclipse.org/technology/ba ...
- 输入一条url后,发生了什么??
(1)浏览器解析 (2)查询缓存 (3)DNS查询 顺序如下,若其中一步成功直接进去建立连接部分: -- 浏览器自身DNS -- 操作系统DNS -- 本地hosts文件 -- 像域名服务器发送请求 ...
- opennebula 镜像池
{ "IMAGE_POOL": { "IMAGE": [ { ", ", ", "TEMPLATE": { & ...
- golang hello
package main import "fmt" func main() { fmt.Printf("Hello, world.\n") }
- 安装MySQLdb for Python3.7
Python连接mysql数据库通过MySQLdb模块,在此记录我安装MySQLdb的过程. 一.系统环境 操作系统:Win7 64位 Python:Python 3.7 二.安装说明 A.如果Pyt ...
- Laravel 测试教程
参考链接:https://laravel-news.com/seeding-data-testing 迁移文件 修改 database/migrations/2014_10_12_000000_cre ...
- 在UIWebView中添加自定义编辑菜单
如何在UIWebView中添加自定义的编辑菜单困扰了很久.没想到意外的简单! 现在很多的内容提供类应用中,长按内容页会选中按的单词并且显示一个编辑菜单.如图: 独乐乐不如众乐乐.一篇好文章是需要大家一 ...
- 编写高质量代码改善C#程序的157个建议——建议11: 区别对待==和Equals
建议11: 区别对待==和Equals 在开始本建议之前,首先要明确概念“相等性”.CLR中将“相等性”分为两类:“值相等性”和“引用相等性”.如果用来比较的两个变量所包含的数值相等,那么将其定义为“ ...
- 编写高质量代码改善C#程序的157个建议——建议3: 区别对待强制转型与as和is
建议3: 区别对待强制转型与as和is 在阐述本建议之前,首先需要明确什么是强制转型,以及强制转型意味着什么.从语法结构上来看,类似下面的代码就是强制转型. secondType = (SecondT ...