MySQL有哪些常见的存储引擎?

主要存储引擎

    • 主要的三个存储引擎
      • MyISAM
      • Memory
      • InnoDB
    • 那存储引擎应该怎么选择?
    • InnoDB 和 MylSAM 主要有什么区别?

MySQL有9种存储引擎,不同的引擎,适合不同的场景,我们最常用的,可能就是InnoDB,应该是从5.5开始,就成为了MySQL的默认存储引擎。

主要的三个存储引擎

在这里插入图片描述
主要存储引擎以及功能如下:

功能MylSAMMEMORYInnoDB
存储限制256TBRAM64TB
支持事务NoNoYes
支持全文索引YesNoYes
支持树索引YesYesYes
支持哈希索引NoYesYes
支持数据缓存NoN/AYes
支持外键NoNoYes

MySQL5.5 之前,默认存储引擎是 MylSAM,5.5 之后变成了 InnoDB。

InnoDB 支持的哈希索引是自适应的,InnoDB 会根据表的使用情况自动为表生成哈希索引,不能人为干预是否在一张表中生成哈希索引。

MySQL 5.6 开始 InnoDB 支持全文索引。

MyISAM

MyISAM基于ISAM存储引擎,并对其进行扩展。
MyISAM拥有较高的插入、查询速度,但没有事务。使用这个存储引擎,每个MyISAM在磁盘上存储成三个文件:

(1) frm文件:存储表的定义数据。

(2) MYD文件:存放表具体记录的数据。

(3) MYI文件:存储索引。

frm和MYI可以存放在不同的目录下。MYI文件用来存储索引,但仅保存记录所在页的指针,索引的结构是B+树结构。下面这张图就是MYI文件保存的机制:

在这里插入图片描述

从这张图可以发现,这个存储引擎通过MYI的B+树结构来查找记录页,再根据记录页查找记录。并且支持全文索引、B树索引和数据压缩。

支持数据的类型也有三种:

(1)静态固定长度表

这种方式的优点在于存储速度非常快,容易发生缓存,而且表发生损坏后也容易修复。缺点是占空间。这也是默认的存储格式。

(2)动态可变长表

优点是节省空间,但是一旦出错恢复起来比较麻烦。

(3)压缩表

上面说到支持数据压缩,说明肯定也支持这个格式。在数据文件发生错误时候,可以使用check table工具来检查,而且还可以使用repair table工具来恢复。

有一个重要的特点那就是不支持事务,但是这也意味着他的存储速度更快,如果你的读写操作允许有错误数据的话,只是追求速度,可以选择这个存储引擎。

Memory

MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。每一个表实际上和一个磁盘文件关联,文件是frm。

  • 支持的数据类型有限制,例如,不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型。

  • 支持的锁粒度为表级锁。所以,在访问量比较大时,表级锁会成为MEMORY存储引擎的瓶颈。

  • 由于数据是存放在内存中,一旦服务器出现故障,数据都会丢失。

  • 查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低。

  • 默认使用hash索引。

  • 如果一个内部表很大,会转化为磁盘表。

  • MEMORY存储引擎支持HASH和BTREE索引。

  • 可以在一个MEMORY表中有非唯一键值。

  • MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引。

  • 当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行DELETE FROM或TRUNCATE TABLE,或者删除整个表(使用DROP TABLE)。

InnoDB

InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,InnoDB是默认的MySQL引擎。

InnoDB主要特性:

  • 支持事务。默认的事务隔离级别为可重复读,通过MVCC(并发版本控制)来实现的。
  • InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。
  • InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键。
  • 可以通过自动增长列,方法是auto_increment。
  • 使用的锁粒度为行级锁,可以支持更高的并发。
  • 支持外键约束,外键约束其实降低了表的查询速度,但是增加了表之间的耦合度。
  • 在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度。
  • 对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上。

InnoDB的存储表和索引也有下面两种形式,

(1) 使用共享表空间存储:所有的表和索引存放在同一个表空间中。
(2) 使用多表空间存储:表结构放在frm文件,数据和索引放在IBD文件中。分区表的每个分区对应单独的IBD文件,使用分区表的好处在于提升查询效率。

对于InnoDB来说,最大的特点在于支持事务,但这以损失效率来换取和保障。

那存储引擎应该怎么选择?

大致上可以这么选择:

  • 大多数情况下,使用默认的 InnoDB 就够了。如果要提供提交、回滚和恢复的事务安全(ACID 兼容)能力,并要求实现并发控制,InnoDB 就是比较靠前的选择了。
  • 如果数据表主要用来插入和查询记录,则 MyISAM 引擎提供较高的处理效率。
  • 如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存的 MEMORY 引擎中,MySQL 中使用该引擎作为临时表,存放查询的中间结果。

使用哪一种引擎可以根据需要灵活选择,因为存储引擎是基于表的,所以一个数据库中多个表可以使用不同的引擎以满足各种性能和实际需求。使用合适的存储引擎将会提高整个数据库的性能。

InnoDB 和 MylSAM 主要有什么区别?

  1. 存储结构:每个 MyISAM 在磁盘上存储成三个文件;InnoDB 所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB。

  2. 事务支持:MyISAM 不提供事务支持;InnoDB 提供事务支持事务,具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全特性。

  3. 最小锁粒度:MyISAM 只支持表级锁,更新时会锁住整张表,导致其它查询和更新都会被阻塞 InnoDB 支持行级锁。

  4. 索引类型:MyISAM 的索引为非聚簇索引,数据结构是 B 树;InnoDB 的索引是聚簇索引,数据结构是 B+树。

  5. 主键必需:MyISAM 允许没有任何索引和主键的表存在;InnoDB 如果没有设定主键或者非空唯一索引,就会自动生成一个 6 字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

  6. 表的具体行数:MyISAM 保存了表的总行数,如果 select count() from table;会直接取出出该值; InnoDB 没有保存表的总行数,如果使用 select count() from table;就会遍历整个表;但是在加了 wehre 条件后,MyISAM 和 InnoDB 处理的方式都一样。

  7. 外键支持:MyISAM 不支持外键;InnoDB 支持外键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/88692.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

A卡崩溃有救了 AMD推出RGD专用工具:找出报错原因

现在的三大显卡GPU厂商中,谁家的显卡好争议不断,粉丝不仅争硬件性能,软件驱动也是容易被诟病的地方,AMD显卡这方面就吃过亏,好在AMD这次推出了一个RGD工具,可以找出显卡崩溃的原因。 AMD日前发布了一个Rade…

自然语言处理2-NLP

目录 自然语言处理2-NLP 如何把词转换为向量 如何让向量具有语义信息 在CBOW中 在Skip-gram中 skip-gram比CBOW效果更好 CBOW和Skip-gram的算法实现 Skip-gram的理想实现 Skip-gram的实际实现 自然语言处理2-NLP 在自然语言处理任务中,词向量(…

vs2008下的mfc hello world实现

笔者不知道会写这种博文,好久没写mfc程序,hello world都不会创建了。起因是来了个mfc任务,那就得把mfc熟悉起来,先看下实现效果吧 因为是基于2008的,那就按照2008创建吧 文章目录 第一步:文件新建项目第二…

Tomcat 部署时 war 和 war exploded区别

在 Tomcat 调试部署的时候,我们通常会看到有下面 2 个选项。 是选择war还是war exploded 这里首先看一下他们两个的区别: war 模式:将WEB工程以包的形式上传到服务器 ;war exploded 模式:将WEB工程以当前文件夹的位置…

Linux环境离线安装MySQL8.0.33

目录 一、准备 1、检查libaio.so.1 2、卸载删除原有的mariadb 3、删除my.cnf 4、下载mysql安装包 二、安装 1、上传mysql 2、建立mysql所需目录 3、建立配置文件my.cnf 4、创建mysql用户并授权 5、初始化数据库 6、启动MySQL数据库 7、常见启动报错处理 8、配置M…

SQLSTATE[IMSSP]: The active result for the query contains no fields.

我的是SQL server 报错场景,代码: $psendmx_sql"SET IDENTITY_INSERT PSENDMX ON;INSERT INTO psendmx (DJBH,MIBH,MXBH,SPDM,GG1DM,GG2DM,SL,SL_2,CKJ,ZK,DJ,DJ_1,JE,HH) VALUES {$mx_values};SET IDENTITY_INSERT PSENDMX OFF;"; $a$db_er…

前端面试必备 | uni-app 篇(P1-15)

文章目录 1. 请简述一下uni-app的定义和特点。2. uni-app兼容哪些前端框架?请列举几个。3. 请简述一下uni-app的跨平台工作原理。4. 什么是条件编译?在uni-app中如何实现条件编译?5. uni-app中的页面生命周期有哪些?请简要介绍。6…

【爬虫GUI】YouTube评论采集软件,突破反爬,可无限爬取!

文章目录 一、背景介绍1.1 软件说明1.2 效果演示 二、科普知识2.1 关于视频id2.2 关于评论时间 三、爬虫代码3.1 界面模块3.2 爬虫模块3.3 日志模块 四、获取源码及软件 一、背景介绍 你好,我是马哥python说 ,一名10年程序猿。 最近我用python开发了一…

javaee idea创建maven项目,使用el和jstl

如果使用el表达式出现下图问题 解决办法 这是因为maven创建项目时&#xff0c;web.xml头部声明默认是2.3&#xff0c;这个默认jsp关闭el表达式 办法1 在每个需要用到el和jstl的页面的上面加一句: <% page isELIgnored"false" %> 方法2 修改web.xml文件开…

Stable Diffusion Web UI的原理与使用

Stable Diffusion是一套基于Diffusion扩散模型生成技术的图片生成方案&#xff0c;随着技术的不断发展以及工业界对这套工程细节的不断优化&#xff0c;使其终于能在个人电脑上运行&#xff0c;本文将从github下载开始讲一讲如何使用Stable Diffusion Web UI进行AI图像的生成。…

Java集合sort排序报错UnsupportedOperationException处理

文章目录 报错场景排查解决UnmodifiableList类介绍 报错场景 我们使用的是PostgreSQL数据库&#xff0c;存储业务数据&#xff0c;业务代码使用的是Spring JPA我们做的是智慧交通信控平台&#xff0c;有个功能是查询展示区域的交通态势&#xff0c;需要按照不同维度排序展示区…

同源策略与解决方法

同源策略与解决方法 1.浏览器的同源策略 1.1 同源策略 同源策略&#xff08;same origin policy&#xff09;&#xff0c;一种安全策略&#xff0c;用于限制一个源的文档或者它加载的脚本如何能与另一个源的资源进行交互。 浏览器默认两个不同的源之间是可以互相访问资源和…