ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL 存储引擎 | innodb和myisam的区别

2021-05-20 17:02:34  阅读:157  来源: 互联网

标签:存储 MyISAM 索引 引擎 InnoDB myisam MySQL innodb


此文档基于MySQL5.7

目录

存储引擎概念

存储引擎有哪些

InnoDB存储引擎的详细信息

InnoDB架构

InnoDB的主要优势

InnoDB和ACID模型

InnoDB和MyISAM特性对比

常用的存储引擎sql


存储引擎概念

储存引擎之于MySQL,犹如发动机之于汽车。不过mysql对存储引擎做了很好的封装,所以对于使用者来说,存储引擎是个黑盒。

存储引擎有哪些

自2010发布的5.5版本MySQL起,InnoDB成为默认的存储引擎。除InnoDB外,MySQL还提供了多个替代存储引擎。

MySQL 存储引擎
存储引擎特性
InnoDB

InnoDB是一种兼顾了高可靠性和高性能的通用存储引擎。在MySQL 5.7中,InnoDB是默认的MySQL存储引擎。除非您配置了其他默认存储引擎,否则发出CREATE TABLE不带ENGINE 子句的语句将创建一个InnoDB表。详细特性见下文。

MyISAM

在MySQL5.1及之前的版本,MyISAM是默认的存储引擎。MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级别锁,而且有一个毫无疑问的缺陷就是崩溃后无法安全恢复。正是由于MyISAM引擎的缘故,即使MySQL支持事务已经很长时间了,在很多人的概念中MySQL还是非事务型的数据库。尽管MyISAM有些缺点,但它绝不是一无是处的。对于只读的数据,或者表比较小、可以忍受修复(repair)操作,则依然可以使用MyISAM引擎。详细特性见下文。

MEMORY

如果需要快速的访问数据,并且这些数据不会被修改,重启后丢失也没关系,那么使用Memory表是非常有用的。Memory表至少比MyISAM表要快一个数量级,因为所有的数据都保存在内存中,不需要进行磁盘I/O。Memory表的结构在重启后会保留,单数据会丢失。

CSV

CSV引擎可以将普通的CSV文件(逗号分割值的文件)作为MySQL的表来处理,但这种表不支持索引。CSV引擎可以在数据库运行时拷入或拷出文件。可以将Excel等电子表格软件中的数据存储为CSV文件,然后复制到MySQL数据目录下,就能在MySQL中打开使用。同样,如果将数据写入到一个CSV引擎表,其他的外部数据也能立即从表的数据文件中读取CSV格式的数据。因此CSV引擎可以作为一种数据交换的机制,非常有用。

ARCHIVE

Archive存储引擎只支持INSERT和SELECT操作,在MySQL5.1之前也不支持索引。Archive存储引擎会缓存所有的写并利用zlib对插入的行进行压缩,所以比MyISAM表的磁盘I/O更少。但是每次SELECT查询都需要执行全表扫描。所以Archive表适合日志和数据采集类应用,这类应用做数据分析时往往需要全表扫描。或者在一些需要更快速的INSERT操作的场合下也可以使用。

Archive存储引擎支持行级锁和专用的缓冲区,所以可以实现高并发的插入。在一个查询开始知道返回表中存在的所有行数之前,Archive存储引擎会阻止其他的SELECT执行,以实现一致性读。另外,也实现了批量插入在完成之前对读操作是不可见的。这种机制模仿了事务和MVCC的一些特性,但Archive存储引擎不是一个事务型的引擎,而是一个针对高速插入和压缩做了优化的简单引擎。

BLACKHOLE

BLACKHOLE引擎没有实现任何的存储机制,它会丢弃所有的插入的数据,不做任何保存。但是服务器会记录BLACKHOLE表的日志,所以可以用于复制数据库的备库,或者只是简单的记录到日志。这种特殊的存储引擎可以在一些特殊的复制框架和日志审核时发挥作用。但这种应用方式我们碰到很多问题,因此不推荐使用。

MERGE

Meger引擎是MyISAM引擎的一个变种。Meger表是由多个MyISAM表合并而来的虚拟表。如果将MySQL用于日志或者数据仓库类应用,该引擎可以发挥作用。但是引入分区功能后,该引擎以已经被放弃。

FEDERATED

Federated引擎是访问其他MySQL服务器的一个代理,它会创建一个到远程MySQL服务器的客户端连接,并将查询传输到远程服务器执行,然后提取或者发送需要的数据。最初设计垓存储引擎是为了和企业级数据库如Microsoft SQL Server和Oracle的类似特性竞争的,可以说更多的是一种市场行为。尽管该引擎看起来提供了一种很好的跨服务器的灵活性,但也经常带来问题,因此默认是禁用的。MariaDB使用了它的一个后续改进版本,叫做FederatedX。

EXAMPLE

EXAMPLE存储引擎是一个存根引擎,什么都不做。其目的是作为MySQL源代码中的一个示例,该示例说明如何开始编写新的存储引擎。

InnoDB存储引擎的详细信息

InnoDB架构

主要分为内存和磁盘两个大部分
内存部分(Memory)又包含Buffer pool(缓冲池), change buffer Log Buffer 等,通过操作系统缓存与硬盘结构进行交互。采用了自适用hash索引。

缓冲池

缓冲池是主内存中的一个区域,在InnoDB访问表和索引数据时会在其中进行 高速缓存。缓冲池允许直接从内存访问经常使用的数据,从而加快了处理速度。在专用服务器上,通常将多达80%的物理内存分配给缓冲池。

为了提高大容量读取操作的效率,缓冲池被划分为多个页面,这些页面可以潜在地容纳多行。为了提高缓存管理的效率,缓冲池被实现为页面的链接列表。使用最近最少使用(LRU)算法的变体,将很少使用的数据从缓存中老化掉。

知道如何利用缓冲池将经常访问的数据保留在内存中是MySQL调优的重要方面。

缓冲池使用LRU算法的变体作为列表进行管理  缓冲池(buffer pool),这次彻底懂了!!!

采用了自适应哈希索引。

硬盘

硬盘部分包含若干个表空间,如系统表空间,单文件表空间,一般表空间,临时表空间,undo表空间和redo log.

InnoDB的主要优势

  • 其DML操作遵循ACID模型,并具有具有提交,回滚和崩溃恢复功能的事务,以保护用户数据
  • 行级锁定和Oracle风格的一致读取可提高多用户并发性和性能
  • InnoDB表将您的数据安排在磁盘上,以基于主键优化查询。每个 InnoDB表都有一个称为聚集索引的主键索引,该索引组织数据以最小化主键查找的I / O
  • 为了保持数据完整性,InnoDB支持 FOREIGN KEY约束。使用外键检查插入,更新和删除,以确保它们不会导致相关表之间的不一致

InnoDB和ACID模型

ACID模式是一组数据库设计原则强调的是,对于业务数据和关键任务应用重要的可靠性方面。MySQL包含诸如InnoDB存储引擎严格遵守ACID模型,因此数据不会损坏,结果不会因软件崩溃和硬件故障等异常情况而失真。当依靠符合ACID的功能时,无需重新发明一致性检查和崩溃恢复机制。如果有其他软件保护措施,超可靠的硬件或可以容忍少量数据丢失或不一致的应用程序,则可以调整MySQL设置,以权衡一些ACID可靠性,以获得更高的性能或吞吐量。

InnoDB和MyISAM特性对比

特征InnoDBMyISAM
B树索引是的是的
备份/时间点恢复(在服务器中而不是在存储引擎中实现。)是的是的
集群数据库支持
聚集索引是的
压缩数据是的是(仅在使用压缩行格式时才支持压缩MyISAM表。将压缩行格式与MyISAM一起使用的表是只读的。)
资料快取是的
加密数据是(通过加密功能在服务器中实现;在MySQL 5.7和更高版本中,支持静态数据加密。)是(通过加密功能在服务器中实现。)
外键支持是的
全文搜索索引是(MySQL 5.6和更高版本提供对FULLTEXT索引的支持。)是的
地理空间数据类型支持是的是的
地理空间索引支持是(MySQL 5.7和更高版本提供对地理空间索引的支持。)是的
哈希索引否(InnoDB在内部将哈希索引用于其“自适应哈希索引”功能。)
索引缓存是的是的
锁定粒度
MVCC是的
复制支持(在服务器中而不是在存储引擎中实现。)是的是的
储存限制64TB64TB
T树索引
交易次数是的
更新数据字典的统计信息是的是的

常用的存储引擎sql

查看当前使用的存储引擎

SHOW ENGINES;

SELECT * FROM INFORMATION_SCHEMA.ENGINES;

设置存储引擎

CREATE TABLE t1 (i INT) ENGINE = INNODB;

更新存储引擎

ALTER TABLE t1 ENGINE = MyISAM;

 引用:

MySQL官方文档

【mysql】Innodb三大特性之adaptive hash index

写缓冲(change buffer),这次彻底懂了!!!

标签:存储,MyISAM,索引,引擎,InnoDB,myisam,MySQL,innodb
来源: https://blog.csdn.net/leo187/article/details/116802204

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有