浅谈MySQL存储引擎-InnoDB&MyISAM

存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取。MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式是不同的。每一种存储引擎都有它的优势和劣势,本文只讨论最常见的InnoDB和MyISAM两种存储引擎进行讨论。本文中关于数据存储形式和索引的可以查看图解MySQL索引

MySQL逻辑架构图:

InnoDB存储引擎

InnoDB是默认的事务型存储引擎,也是最重要,使用最广泛的存储引擎。在没有特殊情况下,一般优先使用InnoDB存储引擎。

1??、数据存储形式

使用InnoDB时,会将数据表分为.frm 和 idb两个文件进行存储。

2??、锁的粒度

InnoDB采用MVCC(多版本并发控制)来支持高并发,InnoDB实现了四个隔离级别,默认级别是REPETABLE READ,并通过间隙锁策略防止幻读的出现。它的锁粒度是行锁。【通过MVCC实现,MVCC在稍后会进行介绍】

3??、事务

InnoDB是典型的事务型存储引擎,并且通过一些机制和工具,支持真正的热备份。

4??、数据的存储特点

InnoDB表是基于聚簇索引(另一篇博客有介绍)建立的,聚簇索引对主键的查询有很高的性能,不过他的二级索引(非主键索引)必须包含主键列,索引其他的索引会很大。

MyISAM存储引擎

1??、数据存储形式

MyISAM采用的是索引与数据分离的形式,将数据保存在三个文件中.frm.MYD,.MYIs。

2??、锁的粒度

MyISAM不支持行锁,所以读取时对表加上共享锁,在写入是对表加上排他锁。由于是对整张表加锁,相比InnoDB,在并发写入时效率很低。

3??、事务

MyISAM不支持事务。

4??、数据的存储特点

MyISAM是基于非聚簇索引进行存储的。

5??、其他

MyISAM提供了大量的特性,包括全文索引,压缩,空间函数,延迟更新索引键等。

进行压缩后的表是不能进行修改的,但是压缩表可以极大减少磁盘占用空间,因此也可以减少磁盘IO,从而提供查询性能。

全文索引,是一种基于分词创建的索引,可以支持复杂的查询。

延迟更新索引键,不会将更新的索引数据立即写入到磁盘,而是会写到内存中的缓冲区中,只有在清除缓冲区时候才会将对应的索引写入磁盘,这种方式大大提升了写入性能。

三、对比与选择

两种存储引擎各有各的有点,MyISAM专注性能,InnoDB专注事务。两者最大的区别就是InnoDB支持事务,和行锁。

如何在两种存储引擎中进行选择?

① 是否有事务操作?有,InnoDB。

②是否存储并发修改?有,InnoDB。

③是否追求快速查询,且数据修改较少?是,MyISAM。

④是否使用全文索引?如果不引用第三方框架,可以选择MyISAM,但是可以选用第三方框架和InnDB效率会更高。

四、浅谈MVCC

MySQL大多数事务型存储引擎实现的都不是简单的行锁。基于提升并发性能的考虑,他们一般都同时实现了多版本并发控制(MVCC)。

可以认为MVCC是行级锁的一个变种,它能在大多数情况下避免加锁操作,因此开销更低。无论怎样实现,它们大豆实现了非阻塞的读操作,写操作也只锁定制定的行。

MVCC是通过保存数据在某一个时间点的快照来实现的,也就是说无论事务执行多久,每个事务看到的数据都是一致的。InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现,这两个列一个保存了行的创建时间,一个保存了行的过期时间(或删除时间),当然,并非存储的是时间,而是系统版本号。每开启一个事务,版本号都会递增,事务开始时刻的系统版本号会作为事务的版本号。

id name 创建时间(行版本号) 删除时间(删除版本号)
1 Mary 1 null
2 Jann 1 null

以InnoDB存储引擎的的REPEATABLE READ隔离级别来说:

SELECT

? ①只查询创建时间版本号小于当前事务版本号的数据行(保证事务读取的行要么在事务开始之前就存在,要么是事务本身插入的行)

? ②行的删除版本号要么未定义,要么大于当前事务版本号,这样可以确保事务读取到的行,在开始事务之前未被删除

只有复合上诉两个条件的记录才会作为结果返回

INSERT

? 为插入的数据保存当前系统版本号作为行版本号

DELETE

? 保存当前系统版本号作为删除行版本号

?

UPDATE

? 插入一行数据,并将当前系统版本号赋予行版本号;同事保存当前系统版本号到原来的行作为删除版本号。

注:MVCC只在REPEATABLE和READ COMMITTED两个隔离级别下才能正常工作。

我的个人博客:李强的个人博客(基于SSM,Nginx+Redis的后台架构)

原文地址:https://www.cnblogs.com/liqiangchn/p/9066686.html

时间: 2024-08-05 19:31:10

浅谈MySQL存储引擎-InnoDB&MyISAM的相关文章

浅谈MySQL存储引擎选择 InnoDB还是MyISAM

如果是一些小型的应用或项目,那么MyISAM 也许会更适合.当然,在大型的环境下使用MyISAM 也会有很大成功的时候,但却不总是这样的.如果你正在计划使用一个超大数据量的项目,那么你应该直接使用InnoDB方式. MyISAM 是MySQL中默认的存储引擎,一般来说不是有太多人关心这个东西.决定使用什么样的存储引擎是一个很tricky的事情,但是还是值我们去研究一下,这里的文章只考虑 MyISAM 和InnoDB这两个,因为这两个是最常见的. 下面先让我们回答一些问题:◆你的数据库有外键吗? 

MySQL存储引擎 InnoDB/ MyISAM/ MERGE/ BDB 的区别

MyISAM:默认的MySQL插件式存储引擎,它是在Web.数据仓储和其他应用环境下最常使用的存储引擎之一.注意,通过更改 STORAGE_ENGINE 配置变量,能够方便地更改MySQL服务器的默认存储引擎. InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持. BDB:可替代InnoDB的事务引擎,支持COMMIT.ROLLBACK和其他事务特性. Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问. Merge:允许MyS

mysql 存储引擎 InnoDB 与 MyISAM 的区别和选择

http://www.blogjava.net/jiangshachina/archive/2009/05/31/279288.html 酷壳 - MySQL: InnoDB 还是 MyISAM? 51cto - InnoDB还是MyISAM 再谈MySQL存储引擎的选择 MyISAM VS InnoDB —— MySQL存储引擎的选择

[转帖]一文看懂mysql数据库本质及存储引擎innodb+myisam

一文看懂mysql数据库本质及存储引擎innodb+myisam https://www.toutiao.com/i6740201316745740807/ 原创 波波说运维 2019-09-29 00:01:00 概述 今天主要讲下mysql数据库引擎的一些概念和mysql数据库本质,一句话总结: 文件夹-文件:一个数据库其实就是一个的文件夹,数据库里面的表就是文件夹里的一个或者多个文件(根据数据库引擎不同而不同,MyISAM是3个,InnoDB是2.5个) mysql的数据库其实就是存放在M

mysql 存储引擎 innodb和myISAM(转)

mysql5.5+的版本默认引擎都是InnoDB,早期的Mysql版本默认的存储引擎是myISAM innodb: 1.事务操作2.外键操作3.行级锁,这是当有where条件的时候.没有where时,不知道在那一个范围进行搜索时,也是表锁.提供和 Oracle 一样的一致性的不加锁读取,能增加并发读的用户数量并提高性能,不会增加锁的数量.4.写的速度快,这是建立在索引的更新操作上 5.InnoDB 的设计目标是处理大容量数据时最大化性能,它的 CPU 利用率是其他所有基于磁盘的关系数据库引擎中最

MySQL存储引擎之MyIsam和Innodb总结性梳理

区别  MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩 展名为.MYD (MYData).索引文件的扩 展名是.MYI (MYIndex). 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的 大小只受限于操作系统文件的大小,一般为 2GB 事务处理上方面: MyISAM类型的表强调的是性能,其执行数 度比InnoDB类型更快,但是不提供事务支

MySQL存储引擎InnoDB与Myisam

InnoDB与Myisam的六大区别 InnoDB与Myisam的六大区别 MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩 展名为.MYD (MYData).索引文件的扩 展名是.MYI (MYIndex). 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的 大小只受限于操作系统文件的大小,一般为 2GB 事务处理上方面: MyISAM类型的

mysql存储引擎-innodb和myisam的详细区别介绍

现网,使用mysql数据库,访问量单台机器可以达到1w/s,使用了好久,打算对mysql的一些知识做总结.先从最基本的存储引擎入手. 我们目前现网使用的存储引擎是: innodb. 一. 数据存储上的区别: myisam的数据,在磁盘上,存于三个文件,分别为数据文件:.myd, 索引文件:.myi,结构文件:.frm; innodb的数据,则受限于操作系统文件的大小,一般为2G. 具体影响: myisam数据库,索引和数据是分开存储的,索引是有压缩的,所以内存使用率比较高.由于文件存在磁盘,所以

MySQL存储引擎Innodb和MyISAM对比总结

Innodb引擎 InnoDB是一个事务型的存储引擎,设计目标是处理大数量数据时提供高性能的服务,它在运行时会在内存中建立缓冲池,用于缓冲数据和索引. Innodb引擎优点 1.支持事务处理.ACID事务特性: 2.实现了SQL标准的四种隔离级别: 3.支持行级锁和外键约束: 4.可以利用事务日志进行数据恢复. Innodb引擎缺点 1.不支持FULLTEXT类型的索引,因为它没有保存表的行数,当使用COUNT统计时会扫描全表. Innodb引擎适用场景 1.需要事务的操作: 2.更新数据需要使