mysql innodb指的是什么
怎么入门数据库编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《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的标准之一。甲骨文公司在2006年五月收购了由Innobase Oy开发的InnoDB。与传统的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的资料请关注golang学习网公众号!

- 上一篇
- Redis实现分布式队列的方法与应用实例

- 下一篇
- 如何在Go中使用二进制文件?
-
- 数据库 · MySQL | 5小时前 |
- MySQL增删改查全攻略详解
- 412浏览 收藏
-
- 数据库 · MySQL | 16小时前 |
- MySQL分片方案与实现方法解析
- 318浏览 收藏
-
- 数据库 · MySQL | 18小时前 |
- MySQL安装配置教程手把手教你安装步骤
- 486浏览 收藏
-
- 数据库 · MySQL | 18小时前 |
- MySQL基础命令速查新手必学指南
- 129浏览 收藏
-
- 数据库 · MySQL | 19小时前 |
- MySQL数据库入门:核心概念与操作全解析
- 315浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- 主键外键关系解析与关联原理
- 157浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL常用存储引擎有哪些?InnoDB与MyISAM对比解析
- 174浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL创建数据库的详细步骤教程
- 283浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQLLIKE查询优化技巧分享
- 302浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL数据库30条必备管理命令
- 143浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL数据同步方式全解析
- 320浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL事务是什么?如何保证数据一致性?
- 260浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 121次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 118次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 131次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 126次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 128次使用
-
- MySQL主从切换的超详细步骤
- 2023-01-01 501浏览
-
- Mysql-普通索引的 change buffer
- 2023-01-25 501浏览
-
- MySQL高级进阶sql语句总结大全
- 2022-12-31 501浏览
-
- Mysql报错:message from server: * is blocked because of many
- 2023-02-24 501浏览
-
- 腾讯云大佬亲码“redis深度笔记”,不讲一句废话,全是精华
- 2023-02-22 501浏览