mysql innodb指的是什么

53次阅读
没有评论

共计 4274 个字符,预计需要花费 11 分钟才能阅读完成。

这篇文章主要讲解了“mysql innodb 指的是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“mysql innodb 指的是什么”吧!

InnoDB 是 MySQL 的数据库引擎之一,现为 MySQL 的默认存储引擎,为 MySQL AB 发布 binary 的标准之一;InnoDB 采用双轨制授权,一个是 GPL 授权,另一个是专有软件授权。InnoDB 是事务型数据库的首选引擎,支持事务安全表(ACID);InnoDB 支持行级锁,行级锁可以最大程度的支持并发,行级锁是由存储引擎层实现的。

如果想看自己的数据库默认使用的那个存储引擎,可以通过使用命令 SHOW VARIABLES LIKE storage_engine

一、InnoDB 存储引擎

InnoDB,是 MySQL 的数据库引擎之一,现为 MySQL 的默认存储引擎,为 MySQL AB 发布 binary 的标准之一。InnoDB 由 Innobase Oy 公司所开发,2006 年五月时由甲骨文公司并购。与传统的 ISAM 与 MyISAM 相比,InnoDB 的最大特色就是支持了 ACID 兼容的事务(Transaction)功能,类似于 PostgreSQL。

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

1、InnoDB 是事务型数据库的首选引擎,支持事务安全表(ACID)

事务的 ACID 属性:即原子性、一致性、隔离性、持久性

                           a. 原子性:原子性也就是说这组语句要么全部执行,要么全部不执行,如果事务执行到一半出现错误,数据库就要回滚到事务开始执行的地方。

                            实现:主要是基于 MySQ 日志系统的 redo 和 undo 机制。事务是一组 SQL 语句,里面有选择,查询、删除等功能。每条语句执行会有一个节点。例如,删除语句执行后,在事务中有个记录保存下来,这个记录中储存了我们什么时候做了什么事。如果出错了,就会回滚到原来的位置,redo 里面已经存储了我做过什么事了,然后逆向执行一遍就可以了。

                               b. 一致性:事务开始前和结束后,数据库的完整性约束没有被破坏。(eg: 比如 A 向 B 转账,不可能 A 扣了钱,B 却没有收到)

                               c. 隔离性:同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰;

                                如果不考虑隔离性则会出现几个问题:

                                i、脏读:是指在一个事务处理过程里读取了另一个未提交的事务中的数据(当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致);(读取了另一个事务未提交的脏数据)

                               ii、不可重复读:在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了;(读取了前一个事务提交的数据,查询的都是同一个数据项)

                                iii、虚读(幻读):是事务非独立执行时发生的一种现象(eg: 事务 T1 对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务 T2 又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务 T1 的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务 T2 中添加的,就好像产生幻觉一样);(读取了前一个事务提交的数据,针对一批数据整体)

                               d. 持久性:事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚

2、InnoDB 是 mySQL 默认的存储引擎,默认的隔离级别是 RR,并且在 RR 的隔离级别下更近一步,通过多版本并发控制(MVCC)解决不可重复读问题,加上间隙锁(也就是并发控制)解决幻读问题。因此 InnoDB 的 RR 隔离级别其实实现了串行化级别的效果,而保留了比较好的并发性能。

MySQL 数据库为我们提供的四种隔离级别:

a、Serializable(串行化):可避免脏读、不可重复读、幻读的发生;

b、Repeatable read(可重复读):可避免脏读、不可重复读的发生;

c、Read committed(读已提交):可避免脏读的发生;

d、Read uncommitted(读未提交):最低级别,任何情况都无法保证;

从 a —- d 隔离级别由高到低,级别越高,执行效率越低

3、InnoDB 支持行级锁。行级锁可以最大程度的支持并发,行级锁是由存储引擎层实现的。

锁:锁的主要作用是管理共享资源的并发访问,用于实现事务的隔离性

类型:共享锁(读锁)、独占锁(写锁 )        

       MySQL 锁的力度:表级锁(开销小、并发性低),通常在服务器层实现

                                    行级锁(开销大、并发性高),只会在存储引擎层面进行实现

4、InnoDB 是为处理巨大数据量的最大性能设计。它的 CPU 效率可能是任何基于磁盘的关系型数据库引擎所不能匹敌的

5、InnoDB 存储引擎完全与 MySQL 服务器整合,InnoDB 存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB 将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件);

6、InnoDB 支持外键完整性约束,存储表中的数据时,每张表的存储都按照主键顺序存放,如果没有显示在表定义时指定主键。InnoDB 会为每一行生成一个 6 字节的 ROWID, 并以此作为主键

7、InnoDB 被用在众多需要高性能的大型数据库站点上

8、InnoDB 中不保存表的行数(eg:select count(*)from table 时,InnoDB 需要扫描一遍整个表来计算有多少行);清空整个表时,InnoDB 是一行一行的删除,效率非常慢;

InnoDB 不创建目录,使用 InnoDB 时,MySQL 将在 MySQL 数据目录下创建一个名为 ibdata1 的 10MB 大小的自动扩展数据文件,以及两个名为 ib_logfile0 和 ib_logfile1 的 5MB 大小的日志文件

二、InnoDB 引擎的底层实现

InnoDB 的存储文件有两个,后缀名分别是 .frm 和 .idb;其中 .frm 是表的定义文件,.idb 是表的数据文件。

1、InnoDB 引擎采用 B +Tree 结构来作为索引结构

B-Tree(平衡多路查找树):为磁盘等外存储设备设计的一种平衡查找树

系统从磁盘读取数据到内存时是以磁盘块位基本单位的,位于同一磁盘块中的数据会被一次性读取出来,而不是按需读取。

InnoDB 存储引擎使用页作为数据读取单位,页是其磁盘管理的最小单位,默认 page 大小是 16k.

系统的一个磁盘块的存储空间往往没有那么大,因此 InnoDB 每次申请磁盘空间时都会是若干地址连续磁盘块来达到页的大小 16KB。

InnoDB 在把磁盘数据读入到磁盘时会以页为基本单位,在查询数据时,如果一个页中的每条数据都能助于定位数据记录的位置,这将会减少磁盘 I / O 的次数,提高查询效率。

B-Tree 结构的数据可以让系统高效的找到数据所在的磁盘块

B-Tree 中的每个节点根据实际情况可以包含大量的关键字信息和分支,例:

每个节点占用一个盘块的磁盘空间,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。

以根节点为例,关键字为 17 和 35,P1 指针指向的子树的数据范围小于 17,P2 指针指向的子树的数据范围为 17—-35,P3 指针指向的子树的数据范围大于 35;

模拟查找关键字 29 的过程:

a. 根据根节点找到磁盘块 1,读入内存。【磁盘 I / O 操作第一次】

b. 比较关键字 29 在区间(17,35),找到磁盘块 1 的指针 P2;

c. 根据 P2 指针找到磁盘块 3,读入内存。【磁盘 I / O 操作第二次】

d. 比较关键字 29 在区间(26,30),找到磁盘块 3 的指针 P2;

e. 根据 P2 指针找到磁盘块 8,读入内存。【磁盘 I / O 操作第三次】

f. 在磁盘块 8 中的关键字列表中找到关键字 29.

MySQL 的 InnoDB 存储引擎在设计时是将根节点常驻内存的,因此力求达到树的深度不超过 3,也就是 I / O 不需要超过三次;

分析上面的结果,发现需要三次磁盘 I / O 操作,和三次内存查找操作。由于内存中的关键字是一个有序表结构,可以利用二分法查找提高效率;而三次磁盘 I / O 操作时影响整个 B -Tree 查找效率的决定因素。

B+Tree

B+Tree 是在 B -Tree 基础上的一种优化,使其更适合实现外存储索引结构,B-Tree 中每个节点中有 key,也有 data,而每一页的存储空间是有限的,如果 data 数据较大时将会导致每个节点(即一个页)能存储的 key 的数量很小。当存储的数据量很大时同样会导致 B -Tree 的深度较大,增大查询时的磁盘 I / O 次数,进而影响查询效率。

在 B +Tree 中所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储 key 值信息,这样可以大大加大每个节点存储的 key 值数量,降低 B +Tree 的高度;

B+Tree 在 B -Tree 的基础上有两点变化:(1)数据是存在叶子节点中的

                                                       (2)数据节点之间是有指针指向的

由于 B +Tree 的非叶子节点只存储键值信息,假设每个磁盘块能存储 4 个键值及指针信息,则变成 B +Tree 后其结构如下图所示:

通常在 B +Tree 上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。

因此可以对 B +Tree 进行两种查找运算,一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。

InnoDB 中的 B +Tree

InnoDB 是以 ID 为索引的数据存储

采用 InnoDB 引擎的数据存储文件有两个,一个定义文件,一个是数据文件。

InnoDB 通过 B +Tree 结构对 ID 建索引,然后在叶子节点中存储记录

若建立索引的字段不是主键 ID,则对该字段建索引,然后在叶子节点中存储的是该记录的主键,然后通过主键索引找到对应记录。

感谢各位的阅读,以上就是“mysql innodb 指的是什么”的内容了,经过本文的学习后,相信大家对 mysql innodb 指的是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-13发表,共计4274字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)