MySQL 中常用的存储引擎

1、MySQL中的存储引擎

MySQL支持多种数据库引擎,每种引擎都有其特定的优势和适用场景。

1.1  InnoDB

这是MySQL的默认数据库引擎。它提供了事务安全(ACID兼容)的表,支持行级锁定和外键约束。InnoDB还具有崩溃恢复能力,对于需要高并发读写和事务支持的应用场景非常适用。

  • 默认存储引擎,支持事务处理(ACID特性),具备崩溃恢复能力。
  • 支持行级锁定,提高并发性能,尤其是在多用户同时更新同一表的不同行时。
  • 支持外键约束,确保数据引用完整性。
  • 采用聚簇索引,数据行和相邻的键值索引存储在一起,优化了点查询和范围查询的性能。
  • 从MySQL 5.6.4开始支持全文索引。

1.2 MyISAM

这是MySQL的传统数据库引擎。它提供了较快的查询性能,特别是对于只读或大量读取的应用。然而,MyISAM不支持事务处理和外键约束,并且在高并发写入时可能表现不佳。

  • 在MySQL早期版本中是默认存储引擎,但后来被InnoDB取代。
  • 不支持事务和行级锁定,仅支持表级锁定,因此在高并发写入场景下性能较低。
  • 支持全文索引,适合全文搜索的应用场景。
  • 数据和索引分开存储在.MYD.MYI文件中,适用于读取密集型应用。
  • 不支持外键约束,不提供崩溃恢复功能。

1.3 Memory (HEAP)

这是一种内存引擎,它将数据存储在内存中,因此提供了非常快的访问速度。但是,由于数据存储在内存中,因此数据容量受到内存大小的限制,并且当数据库服务器重启时,数据会丢失。这种引擎适用于缓存、会话管理等轻量级应用。

  • 数据全部存储在内存中,适合临时表或经常需要进行全表扫描的小型表。
  • 因为数据存储在内存中,所以重启服务后数据会丢失,适用于短期存储或计算密集型任务。

1.4 NDB Cluster(或Cluster/NDB

这是MySQL的簇式数据库引擎,专为高性能查找和高可用性而设计。它可以将数据分布在多台服务器上,提供高可扩展性和高并发性能,适用于大规模分布式系统。

  • 分布式存储引擎,专为高可用性和大规模并行处理而设计。
  • 数据分布在多台机器上,提供高可用性和可扩展性。
  • 特别适合大数据量和高并发的在线事务处理和分析(OLTP/OLAP)场景。

1.5 CSV

这是一种文本文件引擎,可以将数据存储在CSV格式的文本文件中。它适用于需要与其他系统进行数据交换的场景,但同样不支持事务处理和外键约束。

1.6 BLACKHOLE

这是一种虚拟引擎,它不会存储任何数据。任何对这种引擎的写操作都会被忽略,而任何读操作都会返回空结果集。这种引擎通常用于临时禁止对数据库的应用程序输入。

1.7 FEDERATED

这是一种远程引擎,它允许连接到远程MySQL服务器并执行查询。

1.8 ARCHIVE

这是一种用于存储和检索大量归档数据的引擎。

  • 专门用于大容量、只追加、很少更新和查询的场景,例如日志记录。
  • 不支持索引,只支持INSERT和SELECT操作。

1.9 Merge

这是一种将多个MyISAM表组合为一个表的引擎。

  • 用于合并多个MyISAM表作为一个逻辑表来处理,常用于数据分析和数据仓库场景。

注意:

        在选择数据库引擎时,需要根据具体的业务需求和特点进行考虑。例如,如果应用需要事务支持和高并发读写,那么InnoDB可能是更好的选择;而如果应用主要是读取操作且对性能有较高要求,那么MyISAM可能更合适。同时,还需要考虑数据的持久性、备份和恢复策略等因素。

2、MySQL中InnoDB存储引擎

MySQL中的InnoDB存储引擎是一个高度可靠的事务型存储引擎,它的设计目标是满足高并发事务处理和数据安全的需求。

以下是InnoDB存储引擎的主要特点:

  1. 事务支持

    • InnoDB完全支持ACID(原子性、一致性、隔离性、持久性)事务特性,保证了数据的完整性和一致性。
    • 提供了事务管理机制,允许用户执行BEGIN, COMMIT, ROLLBACK等事务操作。
  2. 行级锁定

    • InnoDB使用行级锁定,大大提高了多用户并发环境下的性能,尤其在频繁修改不同记录的情形下,可以减少锁冲突,提升并发读写的效率。
  3. 外键约束

    • 支持外键约束(FOREIGN KEY),确保了数据库表间的数据引用完整性。
  4. MVCC(多版本并发控制)

    • 实现了多版本并发控制机制,从而在多个事务同时读取相同数据时,减少了锁竞争,提升了并发性能,同时也支持“可重复读”(Repeatable Read)事务隔离级别,有效避免了幻读现象。
  5. 崩溃恢复

    • 内置崩溃恢复机制,即使在数据库宕机或系统崩溃后,也能通过redo日志(重做日志)和undo日志(回滚日志)来恢复未完成的事务和回滚已提交的事务。
  6. 缓冲池

    • 使用缓冲池技术,将频繁读写的页缓存在内存中,减少磁盘I/O操作,提高整体性能。
  7. 其他高级特性

    • 插入缓冲(Insert Buffer),优化了非唯一二级索引的插入操作;
    • 两次写(Double Write),用于防止因电源故障等原因导致的数据页损坏;
    • 自适应哈希索引(Adaptive Hash Index),动态创建和维护哈希索引以加速查询;
    • 预读(Read Ahead),预先读取连续的数据页到内存,减少未来查询时的磁盘I/O。

InnoDB存储引擎非常适合那些需要事务处理、高并发读写操作、数据完整性和高性能的应用场景,这也是它成为MySQL默认存储引擎的原因之一。

2、MySQL中MyISAM存储引擎

MyISAM是MySQL中常用的存储引擎之一,尤其在MySQL 5.5版本之前的版本中,它是默认的存储引擎。

MyISAM存储引擎具有一些独特的特点和适用场景。

特点

  1. 非事务性:MyISAM不支持事务处理,这意味着它不能执行跨多个查询的事务。每个查询都是原子性的,但无法回滚。
  2. 表级锁定:MyISAM使用表级锁定,当一个线程获得写锁定时,其他线程对表的读取和写入都会被阻塞。这可能导致较低的并发性能,特别是在写密集的应用中。
  3. 全文索引:MyISAM支持全文索引,这对于需要进行文本搜索的应用非常有用。
  4. 访问速度快:对于只读或大量读取的应用,MyISAM通常提供较快的查询性能。

文件结构

MyISAM存储引擎的表在磁盘上存储为三个文件:

  • .frm 文件:存储表的定义结构。
  • .MYD 文件:存储表的数据(MYData)。
  • .MYI 文件:存储表的索引(MYIndex)。

这种文件结构使得数据文件和索引文件可以放置在不同的目录,从而平均分布I/O负载,提高查询速度。

适用场景

MyISAM适用于以下场景:

  • 只读或大量读取的应用:对于主要进行读取操作的应用,MyISAM通常能提供较好的性能。
  • 全文搜索:如果应用需要进行全文搜索,MyISAM是一个很好的选择,因为它支持全文索引。
  • 不需要事务支持:如果应用不需要事务处理或复杂的并发控制,MyISAM可以是一个简单而高效的解决方案。

需要注意的是:由于MyISAM不支持事务和行级锁定,它在高并发写入或需要保证数据一致性的场景中可能不是最佳选择。在这些情况下,InnoDB存储引擎可能更合适。

3、MySQL中InnoDB和MyISAM存储引擎的区别是什么?

  1. 事务支持

    • InnoDB:支持事务(Transaction)。它提供了ACID兼容的事务安全表,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这意味着在InnoDB中,你可以执行一系列操作作为一个单独的事务,要么全部成功,要么全部失败(回滚),即使在出现错误或者系统崩溃的情况下也能回滚事务,保证数据完整性。。
    • MyISAM:不支持事务。每个查询都是原子性的,但无法执行跨多个查询的事务。这意味着一旦发生错误或者意外中断,自上次成功提交以来对数据所做的更改可能会丢失。
  2. 锁机制

    • InnoDB:使用行级锁定(Row-level locking)。这允许多个用户并发地访问不同的行,提高了并发性能。但是,如果查询条件不是基于主键,InnoDB可能会升级为表锁。
    • MyISAM:使用表级锁定(Table-level locking)。当一个线程获得一个表的写锁定时,其他线程对该表的读取和写入都会被阻塞。这可能会导致较低的并发性能,尤其是在写密集的应用程序中。
  3. 外键约束

    • InnoDB:支持外键(Foreign Key)约束。可以确保数据引用的完整性和一致性。
    • MyISAM:不支持外键。意味着无法强制关联表之间的参照完整性。
  4. 崩溃恢复

    • InnoDB:具有崩溃恢复能力(Crash Recovery Capabilities)。如果数据库服务器崩溃,InnoDB可以恢复未提交的事务,确保数据的完整性。
    • MyISAM:不提供崩溃恢复功能,在服务器崩溃或意外关机时,如果没有正确的关闭,可能发生数据损坏,且修复过程可能较复杂。
  5. 存储格式

    • InnoDB:数据和索引是存储在一起的,称为聚簇索引(Clustered Index)。主键索引的叶子节点包含数据记录,而辅助索引的叶子节点包含主键值。
    • MyISAM:数据和索引是分开存储的。数据文件(.MYD)和索引文件(.MYI)是分开保存的。
  6. 性能

    • InnoDB:将数据和索引存储在一起,并支持聚簇索引(数据行按照主键顺序存放)。在创建索引和加载大量数据时,性能可能稍逊于MyISAM。但在高并发和需要事务支持的应用中,InnoDB通常表现更好。
    • MyISAM:数据和索引分别存储,更适合只读或者以读为主的场景,且在全表扫描以及只读查询的性能上有时优于InnoDB,尤其是在早期版本的MySQL中。
  7. 全文索引

    • InnoDB:早期版本不支持全文索引,但在MySQL 5.6.4以后的版本中引入了全文索引的支持。
    • MyISAM:之前一直是全文索引的主要存储引擎,原生支持全文索引,适用于文本搜索较多的场景。

如何在数据库中使用或者转换成InnoDB引擎

在MySQL中使用InnoDB存储引擎非常简单,因为从MySQL 5.5版本开始,InnoDB就已经是默认的存储引擎了。但如果你需要显式地指定一个表使用InnoDB存储引擎,或者更改现有表的存储引擎为InnoDB,可以按照以下步骤操作:

1、创建新表时指定InnoDB存储引擎

当你使用CREATE TABLE语句创建新表时,可以通过ENGINE关键字指定存储引擎为InnoDB。例如:

CREATE TABLE user( 
id INT AUTO_INCREMENT PRIMARY KEY, 
name VARCHAR(100) NOT NULL, 
description TEXT 
) ENGINE=InnoDB;

在这个例子中,user表将被创建为使用InnoDB存储引擎。

2、更改现有表的存储引擎为InnoDB

如果你已经有一个使用其他存储引擎(如MyISAM)的表,并且想要将其更改为InnoDB,可以使用ALTER TABLE语句。例如:

ALTER TABLE existing_table ENGINE=InnoDB;

这条命令会将existing_table表的存储引擎更改为InnoDB。请注意,在执行此操作之前,最好备份你的数据,以防万一出现任何问题。

检查表的存储引擎

要查看数据库中所有表的存储引擎,可以使用以下查询:

SHOW TABLE STATUS FROM your_database_name;

在返回的结果中,你将看到Engine列,它显示了每个表的存储引擎。

如果你只想查看特定表的存储引擎,可以结合使用SHOW CREATE TABLE命令:

SHOW CREATE TABLE your_table_name;

在返回的CREATE TABLE语句中,你将看到ENGINE关键字后面跟着的就是该表的存储引擎。

更换引擎时需特别注意:

  1. 备份数据:在更改存储引擎之前,特别是当处理大型数据库或关键数据时,强烈建议备份数据库或表。虽然InnoDB和MyISAM之间的转换通常很安全,但总是好的习惯以防万一。

  2. 外键约束:InnoDB支持外键约束,而MyISAM不支持。如果你正在从MyISAM迁移到InnoDB,并且打算使用外键,请确保在转换后定义它们。

  3. 性能考虑:InnoDB和MyISAM在性能上有不同的特点。InnoDB通常在高并发写入和需要事务支持的场景中表现更好,而MyISAM可能在某些只读或大量读取的场景中更快。在更改存储引擎之前,最好了解你的应用需求并进行性能测试。

  4. 空间占用:InnoDB和MyISAM在磁盘空间使用上也有所不同。InnoDB通常会占用更多的空间,因为它存储了更多的元数据,并维护了双写缓冲区等特性。

  5. 版本兼容性:确保你的MySQL版本支持InnoDB,并且是最新的稳定版本,以利用最新的功能和性能改进。

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

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

相关文章

大数据开发(Java面试真题)

大数据开发(Java面试真题) 一、Java基本概念和数据结构1、请解释Java中HashMap和HashTable的区别?2、Java中ThreadLocal的原理是什么?3、请简要说明Java中equals()和hashCode()的作用及区别?4、Java中的四种访问修饰符…

五、OpenAI实战之Assistants API

在8线小城的革委会办公室里,黑8和革委会主任的对话再次展开。 黑8:主任,您知道吗?除了OpenAI API,现在还有一项新的技术叫做Assistants API,它可以帮助我们更好地进行对话和沟通。 主任:Assis…

性能优化-卡牌项目渲染优化

优化的方向 CPU 影响帧率 GPU 影响帧率 内存 超了会崩 显存 显存超了画面会异常,甚至可能导致游戏崩溃 带宽 影响耗电 分辨率 设备性能不行又要求流畅,降低目标渲染分辨率,立竿见影,但是会牺牲画质 场景 1 使用烘焙…

Vue:自动按需导入element-plus图标,动态导入

在 Vue3 中,component 动态组件的 is 属性必须绑定的是组件实例,而不是组件名字 所以需要在JS里面导入组件,创建一个对象存储,利用键值对,返回组件 如何配置自动导入看上一篇:https://blog.csdn.net/ruanc…

Java网络编程详解

目录 网络编程 1、概述 2、网络通信的要素 3、IP 4、端口 5、通信协议 6、TCP 文件上传 Tomcat 7、UDP 单方发送单方接受 双方发送接收 8、URL URL测试 URL下载网络资源 网络编程 1、概述 信件: 计算机网络: 计算机网络是指将地理位置不…

WPF —— TextBlock、LineBreak RadioButton控件详解

一:TextBlock 1&#xff1a;TextBlock 简介 <LineBreak/> 换行 显示文本 标签内容和content属性共存 2、TextBlock 常用的属性 Foreground&#xff1a;TextBlock的文本内容的颜色。 Background&#xff1a;背景&#xff0c;获取或设置要用于填充内容区域背景的 Brush…

冒泡排序的理解与实现【C语言、C++、java】

冒泡排序介绍 冒泡排序(Bubble Sort)&#xff0c;又被称为气泡排序或泡沫排序。 它是一种较简单的排序算法。它会遍历若干次要排序的数列&#xff0c;每次遍历时&#xff0c;它都会从前往后依次的比较相邻两个数的大小&#xff1b;如果前者比后者大&#xff0c;则交换它们的位…

一体机电脑辐射超标整改

电脑一体机是目前台式机和笔记本电脑之间的一个新型的市场产物&#xff0c;它将主机部分、显示器部分整合到一起的新形态电脑&#xff0c;该产品的创新在于内部元件的高度集成。随着无线技术的发展&#xff0c;电脑一体机的键盘、鼠标与显示器可实现无线链接&#xff0c;机器只…

美国站群服务器使用技巧与注意事项

美国站群服务器使用技巧与注意事项有哪些?RAKsmart小编为您整理发布美国站群服务器使用技巧与注意事项&#xff0c;希望对您有帮助。 美国站群服务器的使用技巧主要包括远程管理、灵活配置和备份还原&#xff0c;具体如下&#xff1a; 1. **远程管理**&#xff1a;用户可以通过…

洛谷 P1036 [NOIP2002 普及组] 选数

题目描述 已知 nn 个整数 x_1,x_2,\cdots,x_nx1​,x2​,⋯,xn​&#xff0c;以及 11 个整数 kk&#xff08;k<nk<n&#xff09;。从 nn 个整数中任选 kk 个整数相加&#xff0c;可分别得到一系列的和。例如当 n4n4&#xff0c;k3k3&#xff0c;44 个整数分别为 3,7,12,1…

计算机网络-第5章 运输层(2)

5.6 TCP可靠传输实现 以字节为单位的滑动窗口。 发送窗口已满&#xff0c;停止发送。 发送和接收的数据都来自缓存。 超时重传时间RTO选择&#xff1a;自适应算法&#xff0c; 选择确认SACK&#xff1a;只传送缺少的数据。大多数实现还是重传所有未被确认的数据块。 5.7 TCP的…

Spring 初学者遇到的问题

TagLibraryValidator Spring 实战 5.2 中有个表单需要在 jsp 中遍历数组&#xff0c;添加&#xff1a;<% taglib uri"http://java.sun.com/jsp/jstl/core" prefix"c" %>&#xff0c;访问时发现有些问题&#xff1a; java.lang.NoClassDefFoundError…

Java线程锁之Lock的使用

Lock 的使用 Lock 是java 1.5 中引入的线程同步工具&#xff0c;它主要用于多线程下共享资源的控制。本质上Lock 仅仅是一个接口&#xff0c; 可以通过显式定义同步锁对象来实现同步&#xff0c;能够提供比synchronized 更广泛的锁定操作&#xff0c;并支持多个相关的 Lock接…

LLM 推理优化

LLM 推理服务重点关注两个指标&#xff1a;吞吐量和时延&#xff1a; 吞吐量&#xff1a;主要从系统的角度来看&#xff0c;即系统在单位时间内能处理的 tokens 数量。计算方法为系统处理完成的 tokens个数除以对应耗时&#xff0c;其中 tokens 个数一般指输入序列和输出序列长…

掌握Mongodb,看完这篇文章就够了

目录 1.概念 2.操作 2.1数据库操作 2.2集合操作 2.3数据操作 3.查询 4.常用技术 5.python与MongoDB 1.概念 MongoDB是一种非关系型数据库&#xff08;NoSQL&#xff09;&#xff0c;它以灵活的文档存储格式&#xff08;BSON&#xff09;和强大的查询能…

MinGW-w64的下载与安装

文章目录 1 下载2 安装3 配置环境变量4 验证 1 下载 官网地址&#xff1a;https://www.mingw-w64.org/github地址&#xff1a;https://github.com/niXman/mingw-builds-binaries/releases windows下载 跳转github下载 版本号选择&#xff1a;13.2.0是GCC的版本号&#xff1b…

如何避免MYSQL主从延迟带来的读写问题?

在MYSQL 部署架构选型上&#xff0c;许多公司都会用到主从读写分离的架构&#xff0c;如下是一个一主一从的架构&#xff0c;主库master负责写入&#xff0c;从库slave进行读取。 但是既然是读写分离&#xff0c;必然会面临这样一个问题&#xff0c;当在主库上进行更新后&#…

010-$nextTick

$nextTick 1、问题2、$nextTick3、应用场景 1、问题 Vue 实现响应式&#xff0c;在 data 更新后&#xff0c;一定时间内&#xff0c;没有继续操作DOM&#xff0c;然后会触发浏览器渲染引擎去更新DOM&#xff0c;更新DOM也是需要时间的&#xff0c;所以 data 更新引起的 DOM更新…

FreeRTOS学习第9篇--队列介绍

目录 FreeRTOS学习第9篇--队列介绍1. 数据传输的方法1.1 任务之间如何传输数据1.2 队列的本质 2. 队列的工作原理和实现2.1 创建队列2.2 向队列发送数据2.3 从队列接收数据 3. 使用队列进行任务间的通信3.1 通信示例3.2 同步示例 结论 FreeRTOS学习第9篇–队列介绍 本文目标&a…

《C++游戏编程入门》第1章 类型、变量与标准I/O: Lost Fortune

《C游戏编程入门》第1章 类型、变量与标准I/O: Lost Fortune 1.1.1 使用C编写游戏1.1.2 生成可执行文件1.1.3 错误处理 1.2 第一个C程序01.game_over.cpp01.game_over2.cpp01.game_over3.cpp 1.4 使用算术运算符01.expensive_calculator.cpp 1.5 声明和初始化变量01.game_stats…