Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mysql 学习 --- innodb存储引擎

Mysql 学习 --- innodb存储引擎

原创
作者头像
用户4158112
修改于 2020-11-23 02:49:21
修改于 2020-11-23 02:49:21
9380
举报

MySQL体系结构

□ 连接池组件 □ 管理服务和工具组件

□ SQL接口组件 □ 查询分析器组件

□ 优化器组件 □ 缓冲(Cache)组件

□ 插件式存储引擎 □ 物理文件

1.MySQL数据库区别于其他数据库的最重要的一个特点就是其插件式的表存储引擎。MySQL插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必需的,如SQL分析器和优化器等,而存储引擎是底层物理结构的实现,每个存储引擎开发者可以按照自己的意愿来进行开发。

2.InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用。其特点是行锁设计、支持外键,并支持类似于Oracle的非锁定读,即默认读取操作不会产生锁。从MySQL数据库5.5.8版本开始,InnoDB存储引擎是默认的存储引擎。InnoDB存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由InnoDB存储引擎自身进行管理。从MySQL4.1(包括4.1)版本开始,它可以将每个InnoDB存储引擎的表单独存放到一个独立的ibd文件中。此外,InnoDB存储引擎支持用裸设备(row disk)用来建立其表空间。InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4种隔离级别,默认为REPEATABLE级别。同时,使用一种被称为next-key locking的策略来避免幻读(phantom)现象的产生。除此之外,InnoDB储存引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能。对于表中数据的存储,InnoDB存储引擎采用了聚集(clustered)的方式,因此每张表的存储都是按主键的顺序进行存放。如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此作为主键。InnoDB存储引擎是MySQL数据库最为常用的一种引擎

一 Innodb

简介 -- 从MySQL 5.5版本开始是默认的表存储引擎(之前的版本InnoDB存储引擎仅在Windows下为默认的存储引擎)。该存储引擎是第一个完整支持ACID事务的MySQL存储引擎(BDB是第一个支持事务的MySQL存储引擎,现在已经停止开发),其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以及使用内存和CPU。

作者相关 -- Heikki Tuuri(1964年,芬兰赫尔辛基)是InnoDB存储引擎的创始人,和著名的Linux创始人Linus是芬兰赫尔辛基大学校友。在1990年获得赫尔辛基大学的数学逻辑博士学位后,他于1995年成立Innobase Oy公司并担任CEO。同时,在InnoDB存储引擎的开发团队中,有来自中国科技大学的Calvin Sun。而最近又有一个中国人Jimmy Yang也加入了InnoDB存储引擎的核心开发团队,负责全文索引的开发,其之前任职于Sybase数据库公司,负责数据库的相关开发工作。

应用场景 -- InnoDB存储引擎已经被许多大型网站使用,如用户熟知的Google、Yahoo!、Facebook、YouTube、Flickr,在网络游戏领域有《魔兽世界》、《Second Life》、《神兵玄奇》等。我不是MySQL数据库的布道者,也不是InnoDB的鼓吹者,但是我认为当前实施一个新的OLTP项目不使用MySQL InnoDB存储引擎将是多么的愚蠢。从MySQL数据库的官方手册可得知,著名的Internet新闻站点Slashdot.org运行在InnoDB上。Mytrix、Inc.在InnoDB上存储超过1 TB的数据,还有一些其他站点在InnoDB上处理插入/更新操作的速度平均为800次/秒。这些都证明了InnoDB是一个高性能、高可用、高可扩展的存储引擎。

Innodb存储引擎体系架构:采用多线程模型(后台线程) + 内存块 + 磁盘文件

主要功能

□ 维护所有进程/线程需要访问的多个内部数据结构。□ 缓存磁盘上的数据,方便快速地读取,同时在对磁盘文件的数据修改之前在这里缓存。□ 重做日志(redo log)缓冲。……后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行状态。

多线程模型 :

Measter Thread ---> 主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,合并插入缓冲(INSERT BUFFER)。

IO Thread的工作主要是负责这些IO请求的回调(call back)处理(对读写线程进行回调)

在InnoDB存储引擎中大量使用了AIO(Async IO)来处理写IO请求,这样可以极大提高数据库的性能。而IO Thread的工作主要是负责这些IO请求的回调(call back)处理。InnoDB 1.0版本之前共有4个IO Thread,分别是write、read、insert buffer和log IO thread。在Linux平台下,IO Thread的数量不能进行调整,但是在Windows平台下可以通过参数innodb_file_io_threads来增大IO Thread。从InnoDB 1.0.x版本开始,read thread和write thread分别增大到了4个,并且不再使用innodb_file_io_threads参数,而是分别使用innodb_read_io_threads和innodb_write_io_threads参数进行设置

Purge Thread ---> 用于回收undo页

事务被提交后,其所使用的undolog可能不再需要,因此需要PurgeThread来回收已经使用并分配的undo页。在InnoDB 1.1版本之前,purge操作仅在InnoDB存储引擎的Master Thread中完成。而从InnoDB 1.1版本开始,purge操作可以独立到单独的线程中进行,以此来减轻Master Thread的工作,从而提高CPU的使用率以及提升存储引擎的性能。用户可以在MySQL数据库的配置文件中添加如下命令来启用独立的Purge Thread:

配置: [mysqld]

innodb_purge _thread=1

代码语言:shell
AI代码解释
复制
在InnoDB 1.1版本中,即使将innodb_purge_threads设为大于1,InnoDB存储引擎启动时也会将其设为1,并在错误文件中出现如下类似的提示:[插图]从InnoDB 1.2版本开始,InnoDB支持多个Purge Thread,这样做的目的是为了进一步加快undo页的回收。同时由于PurgeThread需要离散地读取undo页,这样也能更进一步利用磁盘的随机读取性能。如用户可以设置4个Purge Thread:

配置:

[mysqld]

innodb_purge _thread=4

Page Cleaner Thread--> 脏页的回收。

内存块:

1. 缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可将其视为基于磁盘的数据库系统(Disk-base Database)。在数据库系统中,由于CPU速度与磁盘速度之间的鸿沟,基于磁盘的数据库系统通常使用缓冲池技术来提高数据库的整体性能。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
谷歌、脸书、魔兽世界都在用!InnoDB是什么?有哪些关键特性?
导读:InnoDB是事务安全的MySQL存储引擎,设计上采用了类似于Oracle数据库的架构。通常来说,InnoDB存储引擎是OLTP应用中核心表的首选存储引擎。同时,也正是因为InnoDB的存在,才使MySQL数据库变得更有魅力。
IT阅读排行榜
2020/07/21
1K0
MySQL InnoDB 存储引擎原理浅析
本文主要基于MySQL 5.6以后版本编写,多数知识来着书籍《MySQL技术内幕++InnoDB存储引擎》,今年的多数学习知识只写在笔记里,较为零散,最近稍有时间整理出来,分享进步。
程序员小强
2021/05/27
1.6K0
sqk
对于非聚集索引的插入或者更新,不是每一次都直接插入到索引页中,而且先判断插入的非聚集索引页是否在缓存池中。若在,则直接插入;若不在,则先放入到一个Insert Buffer对象中去。数据库这个非聚集的索引已经插入到叶子节点了,而实际上没有,只是存放到了一个位置,然后以一定的频率和情况刷新进行Insert Buffer和辅助索引叶子节点的merge操作。这时通常能将多个插入操作合并到一个操作中(因为在一个索引页中),这就大大的提高了对于非聚集索引插入的性能。
Michel_Rolle
2024/09/13
3K0
MySQL的“心脏”:InnoDB存储引擎的深度解析与源码探秘!
在MySQL的世界里,InnoDB存储引擎就像心脏一样,为数据库的稳定运行提供了强大的动力。今天,我们将深入探讨InnoDB存储引擎的默认性、使用原因、运行原理、应用场景以及源码分析。如果你对数据库的内部机制感兴趣,或者正在寻找提高数据库性能的秘诀,那么这篇文章绝对不容错过!
疯狂的KK
2024/06/03
1.5K0
MySQL的“心脏”:InnoDB存储引擎的深度解析与源码探秘!
【赵渝强老师】MySQL的InnoDB存储引擎
InnoDB是当前MySQL的默认的存储引擎,也是互联网等公司数据库存储引擎的不二选择。InnoDB的特性如下:
赵渝强老师
2024/08/13
1520
【赵渝强老师】MySQL的InnoDB存储引擎
MySQL InnoDB 存储结构
由上图可以看出,tablespace由segment组成,segment由extend组成,extend由page组成,page由row组成 在MySQL中默认会有一个共享表空间ibdata1,如果设置了innodb_file_per_table=on时,每张表内的数据放在各自的tablespace中,私有tablespace仅包括数据,索引,插入缓冲Bitmap页,而其他的例如回滚信息,插入缓冲索引页,系统事务信息,二次写缓冲等都还是放在共享表空间
yingzi_code
2019/08/31
1.6K0
【MySQL-23】万字总结<InnoDB引擎>——【逻辑存储结果&架构(内存结构,磁盘结构,后台线程)&事务原理&MVCC】
两次查询我们会得到如下两个ReadView (而RR可重复读级别下就只会有一个)
YY的秘密代码小屋
2024/09/09
2320
【MySQL-23】万字总结<InnoDB引擎>——【逻辑存储结果&架构(内存结构,磁盘结构,后台线程)&事务原理&MVCC】
InnoDB 存储引擎.
InnoDB 存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作:
JMCui
2020/07/15
5990
初探Mysql架构和InnoDB存储引擎
4.更新操作为什么不直接更新磁盘反而设计这样⼀个复杂的InnoDB存储引擎来完成?
HUC思梦
2021/03/27
1.2K0
MySQL InnoDB 存储引擎探秘
在MySQL中InnoDB属于存储引擎层,并以插件的形式集成在数据库中。从MySQL5.5.8开始,InnoDB成为其默认的存储引擎。InnoDB存储引擎支持事务、其设计目标主要是面向OLTP的应用,主要特点有:支持事务、行锁设计支持高并发、外键支持、自动崩溃恢复、聚簇索引的方式组织表结构等。
烂猪皮
2019/03/12
1.1K0
MySQL InnoDB 存储引擎探秘
《MySQL技术内幕:InnoDB存储引擎》读书笔记.
1、MySQL 被设计成一个单进程多线程架构的数据库,MySQL 数据库实例在系统上的表现就是一个进程。
JMCui
2021/03/04
7610
《MySQL技术内幕:InnoDB存储引擎》读书笔记.
MySQL五:InnoDB线程模型
在Innodb存储引擎中,后台线程的主要作用是「负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据」。此外它会将已经修改的数据文件刷新到磁盘文件中,保证在发生异常的情况下,Innodb能够恢复到正常的运行状态。
云扬四海
2022/09/26
4750
MySQL - 存储引擎初探
存储引擎是 MySQL 中具体与文件打交道的子系统,它是根据 MySQL AB 公司提供的文件访问层抽象接口定制的一种文件访问机制,这种机制就叫作存储引擎 。
小小工匠
2021/08/17
8050
MySQL InnoDB引擎
表空间是InnoDB存储引擎逻辑结构的最高层, 如果用户启用了参数 innodb_file_per_table(在8.0版本中默认开启) ,则每张表都会有一个表空间(xxx.ibd),一个mysql实例可以对应多个表空间,用于存储记录、索引等数据。
用户9615083
2022/12/25
1.5K0
MySQL InnoDB引擎
面试系列-innodb知识点
InnoDB 主要包括了内存池、后台线程以及存储文件。内存池又是由多个内存块组成的,主要包括缓存磁盘数据、redo log 缓冲等;后台线程则包括了 Master Thread、IO Thread以及 Purge Thread 等;由 InnoDB 存储引擎实现的表的存储结构文件一般包括表结构文件(.frm)、共享表空间文件(ibdata1)、独占表空间文件(ibd)以及日志文件(redo文件等)等。
用户4283147
2022/10/27
4710
面试系列-innodb知识点
MySQL 存储引擎(2)原
顾名思义,存储引擎就是用于存储我们的数据的。在关系型数据库中我们一般将数据库存放在表中(Table)。
兜兜毛毛
2020/04/23
5660
MySQL内核InnoDB存储引擎详解
MySQL从5.5版本开始将InnoDB作为默认存储引擎,该存储引擎是第一个完整支持事务ACID特性的存储引擎,且支持数据行锁,多版本并发控制(MVCC),外键,以及一致性非锁定读。 作为默认存储引擎,也就意味着默认创建的表都会使用此存储引擎,除非 使用ENGINE=参数指定创建其他存储引擎的表。
星哥玩云
2022/08/17
3.4K0
MySQL内核InnoDB存储引擎详解
Innodb是如何运转的
Master Thread是非常核心的后台线程,主要负责脏页的刷新,合并插入缓冲,UNDO页回收等。
大忽悠爱学习
2022/12/07
3900
Innodb是如何运转的
一条命令解读InnoDB存储引擎—show engine innodb status
InnoDB是MySQL使用最多的存储引擎,通常InnoDB状态可以通过show engine innodb status\G查看。
MySQL轻松学
2019/05/13
14K0
你真的了解Innodb存储引擎?
InnoDB的性能和自动崩溃恢复特性,使得它在非事务性存储的需求中也有广泛的应用。
Liusy
2021/03/03
4420
你真的了解Innodb存储引擎?
相关推荐
谷歌、脸书、魔兽世界都在用!InnoDB是什么?有哪些关键特性?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档