详解InnoDB——综述

简介: 详解InnoDB——综述

从 mysql-5.5 开始innodb作为默认的存储引擎了 ,是最重要使用最广泛的存储引擎,它被设计用来处理大量的短期事务,短期事务大部分是正常提交的,也会被回滚,InnoDB的性能和自动崩溃恢复特性(基于redo log实现的crash-safe),使得在非事务型存储的需求中也非常流行

mysql分为客户端、Server层、存储引擎,存储引擎除非非常特殊的原因,否则优先考虑InnoDB

概述

InnoDB采用MVCC来支持高并发,并且实现了4个标准的蛤蜊级别,默认级别是REPEATABLE READ(可重复读),并且使用间隙锁(next-key locking)策略放置幻读的出现,使InnoDB不仅仅锁定查询的行,还会对索引中的间隙进行锁定,以防止幻影行的插入

InnoDB是基于聚簇索引建立的,聚簇索引对主键查询有很大作用,二级索引中包含的列(InnoDB采用B+Tree,树的叶子节点就是主键索引,这也是二级索引需要回表的原因),这也就导致了如果主键索引比较大,其他所有索引都会很大,所以表中索引较多时,主键应该尽可能的小

MylSAM存储引擎

MySQL5.1及以前的版本MylSAM是默认的存储引擎,MylSAM提供了包括全文索引、压缩、空间函数等特性,最大的缺陷就是不支持事务和行级锁,

另一个缺陷就是由于没有redo log,所以MylSAM没有InnoDB支持的快速恢复功能

MylSAM也有自己的优势,对于只读的数据,或者表比较小,可以使用MylSAM

存储

MylSAM将表存储在两个文件,数据文件和索引文件

特性

加锁与并发

MylSAM对整张表加锁,而不是行锁,读取时会将涉及到的所有表加共享锁,写时加排它锁,但是有读取的同时可以并发插入

修复

MylSAM检查表的错误,可以手动或者自动的修复

索引

支持全文索引

MylSAM和InnoDB的区别

  1. MylSAM提供了包括全文索引、压缩、空间函数等特性,最大的缺陷就是不支持事务和行级锁,而InnoDB支持事务和行级锁
  2. InnoDB支持事务、备份、崩溃恢复
  3. MyISAM适合查询以及插入为主的应用。
  4. InnoDB支持外键,MyISAM不支持
  5. InnoDB中不保存表的行数,如select count() from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含where条件时MyISAM也需要扫描整个表
  6. InnoDB是聚簇索引(叶子节点存数据),MyISAM是非聚簇索引(叶子节点存指针)

特性

(1)插入缓冲

对于非聚集类索引的插入和更新操作,不是每一次都直接插入到索引页中,而是先插入到内存中。就相当于加了一层“redis”。

具体做法是:如果该索引页在缓冲池中,直接插入;否则,先将其放入“插入缓冲区”中,然后再以一定的频率和索引页合并。这时,就可以将同一个索引页中的多个插入合并到一个IO操作中,大大提高写性能。

(2)两次写

在应用重做日志前,会先建立一个页的副本,当写入失效发生时,先通过页的副来还原该页,再进行重做。

3)自适应哈希索引

哈希是一种非常快的查找方法,一般仅需要一次查找就能定位数据,而B+树需要3~4次。InnoDB会监控对表中数据的查询,如果觉得换为哈希索引能提升速度,就会自动建立哈希索引。

(4)异步IO

用户可以在发出一个IO请求后立即再发出另一个IO请求,当全部发送完毕后,再等待所有IO操作的完成。同时,也可以将多个IO合并为一个IO。

(5)刷新邻接页

当刷新一个脏页时,InnoDB会检测该页所在区的所有页,如果是脏页,会一起刷新。这样能减少IO次数。

目录
相关文章
|
关系型数据库 MySQL 数据库
图解MySQL【日志】——两阶段提交
两阶段提交是为了解决Redo Log和Binlog日志在事务提交时可能出现的半成功状态,确保两者的一致性。它分为准备阶段和提交阶段,通过协调者和参与者协作完成。准备阶段中,协调者向所有参与者发送准备请求,参与者执行事务并回复是否同意提交;提交阶段中,若所有参与者同意,则协调者发送提交请求,否则发送回滚请求。MySQL通过这种方式保证了分布式事务的一致性,并引入组提交机制减少磁盘I/O次数,提升性能。
1143 5
图解MySQL【日志】——两阶段提交
|
Rust API Go
API 网关 OpenID Connect 实战:单点登录(SSO)如此简单
单点登录(SSO)可解决用户在多系统间频繁登录的问题,OIDC 因其标准化、简单易用及安全性等优势成为实现 SSO 的优选方案,本文通过具体步骤示例对 Higress 中开源的 OIDC Wasm 插件进行了介绍,帮助用户零代码实现 SSO 单点登录。
2076 109
|
存储 数据库
LabVIEW如何修复或重置NI MAX数据库文件
LabVIEW如何修复或重置NI MAX数据库文件
475 0
|
Java 编译器 Spring
面试突击78:@Autowired 和 @Resource 有什么区别?
面试突击78:@Autowired 和 @Resource 有什么区别?
17226 7
|
XML Java 程序员
保姆级教程,手把手教你实现SpringBoot自定义starter
保姆级教程,手把手教你实现SpringBoot自定义starter
14370 2
保姆级教程,手把手教你实现SpringBoot自定义starter
|
存储 关系型数据库 MySQL
使用Docker快速部署Mysql服务器
本文介绍了如何使用Docker快速部署MySQL服务器,包括下载官方MySQL镜像、启动容器、设置密码、连接MySQL服务器以及注意事项。
1277 18
|
缓存 API 持续交付
阿里巴巴热卖商品推荐API接口的获取与应用
阿里巴巴推出热卖商品推荐API接口,基于AI算法,根据用户行为推荐商品,涵盖名称、价格、描述等信息。本文介绍其获取与应用方法,帮助商家和开发者提高推荐精准度和用户满意度,优化库存管理和营销策略,提升整体销售效果。
1230 0
|
Unix 编译器 Go
|
缓存 定位技术 Python
是时候跟Conda说再见了
是时候跟Conda说再见了
3570 2
|
Ubuntu Linux 开发工具
Windows11 WSL2 Ubuntu编译安装perf工具
Windows11 WSL2 Ubuntu编译安装perf工具
1036 0

热门文章

最新文章