MySQL存储引擎概述

news2024/10/7 13:21:26

前言:MySQL语句执行流程为:SQL语句→查询缓存→解析器→优化器→执行器(执行器会调用执行引擎API);人们把“连接管理、查询缓存、语法解析、查询优化”这些并不涉及真实数据存储的功能划分为MySQL server的功能,把真实存取数据的功能划分为存储引擎的功能。索引MySQL server完成了查询优化后,只需要安装生成的执行计划调用底层存储引擎提供的API,获取到数据后返回给客户端就好了。

1、什么是存储引擎

MySQL中提到了存储引擎的概念。简而言之,存储引擎就是至表的类型。其实存储引擎以前叫做表处理器,后来改名为存储引擎,它的功能就是接收上层传下来的指令,然后对表中的数据进行提取或写入操作。

查看存储引擎:

以MySQL8为例:

<1>引擎表

show engines;

如:

<2>查看默认存储引擎

show variables like '%storage_engine%';
--或者
SELECT @@default_storage_engine;

 如:

 注意:MySQL5.5之前,默认使用的是MRG_MYISAM

<3>修改存储引擎

  • 临时修改
SET DEFAULT_STORAGE_ENGINE=MyISAM;
  • 修改my.conf文件:
default-storage-engine=MyISAM;

重启下MySQL服务即可(systemctl restart mysqld.service

  • 创建表时,也可以显式地指明存储引擎
CREATE TABLE USER_TEST(ID INT) ENGINE = InnodB;

2、引擎介绍

2.1、InnoDB引擎:具备外键支持功能的事务存储引擎

  • MySQL从3.23.34a开始就包含InnoDB存储引擎。>=5.5之后,默认采用该引擎
  • InnoDB是MySQL的默认事务型引擎,它被涉及用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(commit)和回滚(Rollback)。
  • 除了增加和查询外,还需要更新、删除操作,应优先选择InnoDB存储引擎。
  • 除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。
  • 数据文件结构:(在《第02章_MySQL数据目录》章节已讲)

                      - 表名.frm 存储表结构(MySQL8.0时,合并在表名.ibd中)

                      - 表名.ibd 存储数据和索引

  • InnoDB是为处理巨大数据量的最大性能设计。       

                      - 在以前的版本中,字典数据以元数据文件、非事务表等来存储。现在这些元数据文件被删除了。比如:.frm,.par,.trn,.isl,.db.opt等在MySQL8.0中不存在了。

  • 对比MyISAM的存储引擎,InnoDB写的处理效率差一些(InnoDB的缺点),并且会占有更多的磁盘空间以保存数据和索引。
  • MyISAM只缓存索引,不缓存真实数据;InnoDB不仅缓存索引还要缓存真实数据,对内存要求较高(InnoDB的缺点),而且内存大小对性能有决定性的影响。

InnoDB表的优势
InnoDB存储引擎在实际应用中拥有诸多优势,比如操作便利、提高了数据库的性能、维护成本低等。如果由于硬件或软件的原因导致服务器崩溃,那么在重启服务器之后不需要进行额外的操作。InnoDB崩溃恢复功能自动将之前提交的内容定型,然后撤销没有提交的进程,重启之后继续从崩溃点开始执行。

InnoDB存储引擎在主内存中维护缓冲池,高频率使用的数据将在内存中直接被处理。这种缓存方式应用于多种信息,加速了处理进程。

在专用服务器上,物理内存中高达80%的部分被应用于缓冲池。如果需要将数据插入不同的表中,可以设置外键加强数据的完整性。更新或者删除数据,关联数据将会被自动更新或删除。如果试图将数据插入从表,但在主表中没有对应的数据,插入的数据将被自动移除。如果磁盘或内存中的数据出现崩溃,在使用脏数据之前,校验和机制会发出警告。当海个表的主键都设置合理时,与这些列有关的操作会被自动优化。插入、更新和删除操作通过做改变缓冲自动机制进行优化。InnoDB不仅支持当前读写,也会缓冲改变的数据到数据流磁盘。

2.2、MyISAM引擎:主要的非事务处理存储引擎

  • MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务、行级锁、外键,有一个很大的缺陷:崩溃后无法安全恢复。
  • 5.5之前默认的存储引擎
  • 优势是访问的速度快,在事务完整性没有要求或者以SELECT、INSERT为主的应用
  • 针对数据统计有额外的常数存储。故而count(*)的查询效率很高(原本:MyISAM引擎会有一个专门的变量,记录count数量(这里的count是指表中的所有数据,查询count时不能附带任何的where条件),因此查询效率极快)
  • 数据文件结构:(在《第02章_MySQL数据目录》章节已讲)

                        - 表名.frm 存储表结构

                        - 表名.MYD 存储数据(MYData)

                        - 表名.MYI 存储索引(MYIndex)

  • 应用场景:只读应用或者以读为主的业务

2.3、InnoDB与MyISAM的选择问题

很多人对InnoDB和MyISAM的取舍存在疑问,到底选择哪个比较好呢?

MySQL5.5之前的默认存储引擎是MyISAM,5.5之后改为了InnoDB。

首先对于InnoDB存储引擎,提供了良好的事务管理、崩溃修复能力和并发控制。因为InnoDB存储引擎支持事务,所以对于要求事务完整性的场合需要选择InnoDB,比如数据操作除了插入和查询以外还包含有很多更新、删除操作,像财务系统等对数据准确性要求较高的系统。缺点是其读写效率稍差,占用的数据空间相对比较大。

其次对于MyISAM存储引擎,如果是小型应用,系统以读操作和插入操作为主,只有很少的更新、删除操作,并且对事务的要求没有那么高,则可以选择这个存储引擎。MyISAM存储引擎的优势在于占用空间小,处理速度快;缺点是不支持事务的完整性和并发性。

这两种引擎各有特点,当然你也可以在MySQL中,针对不同的数据表,可以选择不同的存储引擎。

 2.4、Archive引擎:用于数据存档

  • archive是“归档”的意思(主要功能),仅仅支持插入和查询两种功能(行被插入后不能再修改,可以理解为历史不容修改)。
  • 在MySQL5.5以后支持索引功能。
  • 拥有很好的压缩机制,使用zlib压缩库,在记录请求的时候实时的进行压缩,经常被用来作为仓库使用。
  • 创建ARCHIVE表时,存储引擎会创建名称以表名开头的文件。数据文件的扩展名为 .ARZ
  • 根据英文的测试结论来看,同样数据量下,Archive表比MyISAM表要小大约75%,比支持事务处理的InnoDB表小大约83%。
  • ARCHIVE存储引擎采用了行级锁。该ARCHIVE引擎支持 AUTO_INCREMENT列属性。AUTO_INCREMENT列可以 具有唯一索引或非唯一索引。尝试在任何其他列上创建索引会导致错误。
  • archive表适合日志和数据采集(档案)类应用;适合存储大量的独立的作为历史记录的数据。拥有很高的插入速度,但是对查询的支持较差。
  • 下表展示了ARCHIVE 存储引擎功能

2.5、Blackhole引擎:丢弃写操作,读操作会返回空内容

  • Blackhole引擎没有实现任何存储机制,它会丢弃所有插入的数据,不做任何保存。
  • 但服务器会记录Blacklole表的日志,所以可以用于复制数据到备库,或者简单地记录到日志。但这种应用方式会碰到很多问题,因此并不推荐。

2.6、CSV引擎:存储数据时,以逗号分隔各个数据项

  • CSV引擎可以将 普通的CSV文件作为MySQL的表来处理,但不支持索引。
  • CSV引擎可以作为一种数据交换的机制,非常有用(类似于JSON)。
  • CSV存储的数据直接可以在操作系统里,用文本编辑器,或者excel读取。
  • 对于数据的快速导入、导出是有明显优势的。

2.7、Memory引擎:置于内存的表

概述:

Memory采用的逻辑介质是内存响应速度很快,但是当mysqld守护进程崩溃的时候数据会丢失。另外,要求存储的数据是数据长度不变的格式,比如,Blob和Text类型的数据不可用(长度不固定的)。

主要特征:

  • Memory同时支持哈希(HASH)索引B+树索引

                - 哈希索引相等的比较快,但是对于范围的比较慢很多。

                - 默认使用哈希(HASH)素引,其速度要比使用B型树(BTREE)索引快

                - 如果希望使用B树索引,可以在创建索引时选择使用。

  • Memory表至少比MyISAM表要快一个数量级。
  • MEMORY表的大小是受到限制的。表的大小主要取决于两个参数,分别是max_rowsmax_heap_table_size。其中,max_rows可以在创建表时指定;max_heap_table_size的大小默认为16MB, 可以按需要进行扩大。
  • 数据是存储在内存中的,但是表结构还是存储在磁盘中
  • 缺点:其数据易丢失,生命周期短。基于这个缺陷,选择Memory存储引擎时需要特别小心、

使用场景:

临时表,其他的都优先使用Redis

2.8、Federated引擎:访问远程表

  • Federated引擎是访问其他MySQL服务器的一个代理,尽管该引擎看起来提供了一种很好的跨服务器的灵活性,但也经常带来问题,因此默认是禁言的

2.9、Merge引擎:管理多个MyISAM表构成的表集合

2.10、NDB引擎:MySQL集群专用存储引擎

也叫做NDB Cluster存储引擎,主要用于MySQL Cluster 分布式集群环境,类似于oracle的RAC集群。

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

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

相关文章

TiDB亿级数据亚秒响应查询整体架构

目录 1 TiDB的优势2 TiDB的组件2.1 TiDB Server2.2 PD (Placement Driver) Server2.3 TiKV Server2.4 TiSpark2.5 TiFlash 3 TiKV整体架构3.1 Region分裂与合并3.2 Region调度3.3 分布式事务 4 高可用架构4.1 TiDB高可用4.2 PD高可用4.3 TiKV高可用 5 应用场景5.1 MySQL分片与合…

在地质区划图上绘制伪震中

import numpy as np import matplotlib.pyplot as plt #matplotlib inline from matplotlib import image from matplotlib import pyplot as plt import cv2 # 解析文件&#xff0c;按空格分割字段&#xff0c;得到一个浮点数字类型的矩阵 def loadDataSet(fileName): dataMa…

chatgpt赋能python:Python办公自动化:优化SEO工作效率的关键

Python办公自动化&#xff1a;优化SEO工作效率的关键 随着互联网的不断发展&#xff0c;SEO已经成为了许多企业在网络中展示自己的必备手段。然而&#xff0c;SEO工作需要大量重复性、繁琐的操作&#xff0c;如关键词排名、竞争对手分析、数据收集等&#xff0c;这些工作占据了…

一文说透ES6中的箭头函数表达式

一 总述 ​箭头函数表达式的语法比函数表达式更简洁&#xff0c;并且没有自己的this&#xff0c;arguments&#xff0c;super或new. target。箭头函数表达式更适用于那些本来需要匿名函数的地方&#xff0c;并且它不能用作构造函数。 二 详细 1 1个或多个参数 (param1, par…

【数据结构每日一题】队列——用栈实现队列

[数据结构习题]队列——用栈实现队列 &#x1f449;知识点导航&#x1f48e;&#xff1a;【数据结构】栈和队列 &#x1f449;[王道数据结构]习题导航&#x1f48e;&#xff1a; p a g e 85.3 page85.3 page85.3 本节为栈和队列的综合练习题 题目描述&#xff1a; &#x1f…

【AI绘图】五、stable diffussion模型的介绍与使用

1. 下载模型 主流模型下载网站&#xff1a; 1&#xff09;Hugging face 是一个专注于构建、训练和部署先进开源机器学习模型的网站&#xff1a; https://huggingface.co/ 2&#xff09;Civitai 是一个专为 Stable Diffusion AI 艺术模型设计的网站&#xff1a; https://civi…

Python数据分析script必备知识(四)

Python数据分析script必备知识(四) 1.保留最近N天的日志 1.批量创建多个文件 首先,为演示方便,在指定文件夹目录下用下面代码批量新建多个log文件 """ 批量创建多个文件 """ import os file_path = os.path.join(os.getcwd(),LOG) # 如果不…

「详细教程」使用git将本地项目上传至Github仓库(MacOS为例)

前言&#xff1a;最近需要将自己的代码开源至自己的Github仓库&#xff0c;然而发现并没有一键上传文件夹的选项&#xff0c;于是参考现有教程进行了实践&#xff0c;成功✌️以下是详细步骤。 Tips&#xff1a;在文章录用之后&#xff0c;小伙伴们可以选择将自己的代码开源&am…

QMessageBox信息模态对话框详细使用教程,对象创建栈和指针类型,对话框的风格样式设置,不要浪费实时间自己封装了,图文并茂,看图说话。

QMessageBox 界面设计图展示效果【1】PC端使用QMessageBoxinformation &#xff08;常规信息&#xff09;warning &#xff08;警告消息&#xff09;critical &#xff08;错误信息&#xff09;about (关于信息&#xff0c;无按钮)question &#xff08;问题信息&#xff1f;&a…

Android开发 LogDog (日志狗)V2.0.0

目录 一、简介 二、使用推荐 1、初始化LogDog 2、运行中如何更改初始化时的配置&#xff1f; 三、更改 四、新功能 1、Log过滤 2、自定义打印 3、提供占位符式打印 一、简介 LogDog V1.0 版本https://blog.csdn.net/Ym_quiet/article/details/130453232?spm1001.2014…

javascript基础二十六:JavaScript中如何实现函数缓存?有哪些应用场景?

一、是什么 函数缓存&#xff0c;就是将函数运算过的结果进行缓存 本质上就是用空间&#xff08;缓存存储&#xff09;换时间&#xff08;计算过程&#xff09; 常用于缓存数据计算结果和缓存对象 const add (a,b) > ab; const calc memoize(add); // 函数缓存 calc(1…

Linux邮件发送教程:深入了解mail命令

前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文是专栏【linux基本功-基础命令实战】的第59篇文章。 专栏地址&#xff1a;[linux基本功-基础命令专栏] &#xff0c; 此专栏是沐风晓月对Linux常用命令的汇总&#xff0c;希望能够加深自己的印象&am…

Java进行公众号开发的常见使用场景及解决方案

Java进行公众号开发的常见使用场景解决方案 文章简介 本文总结了本人在开发过程中遇到的有关于微信开发的诸多常见功能&#xff0c;这些问题在网上找都是零散的回答&#xff0c;所以再此总结一下&#xff0c;方便后续开发。如果有错误之处&#xff0c;还望批评指出&#xff0…

使用Kaggle GPU资源免费体验Stable Diffusion开源项目

使用Kaggle GPU资源免费体验Stable Diffusion开源项目 前言相关介绍Stable Diffusion Kaggle开源项目编辑并复制项目运行项目打开网址&#xff0c;即可体验 参考 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Y…

javascript基础二十五:说说你对函数式编程的理解?优缺点?

一、是什么 函数式编程是一种"编程范式"&#xff08;programming paradigm&#xff09;&#xff0c;一种编写程序的方法论 主要的编程范式有三种&#xff1a;命令式编程&#xff0c;声明式编程和函数式编程 相比命令式编程&#xff0c;函数式编程更加强调程序执行…

C SS复习笔记

1.img标签 img的src属性是图片显示不出来时显示的文字 ing的title属性是光标放到图片上&#xff0c;提示的文字 2.a标签 a标签的target属性表示打开窗口的方式&#xff0c;默认的值是_self表示当前窗口的打开页面&#xff0c;_blank表示新窗口打开页面。 a标签的href链接分…

2023.06.04 学习周报

文章目录 摘要文献阅读1.题目2.背景3.方案4.本文贡献5.模型5.1 图注意力形式5.2 superGAT 6.实验7.结论 有限元数学建模深度学习1.高斯扩散2.原理 总结 摘要 This week, I read a computer science about GNN. At present, the attention mechanism of graph neural network i…

Go Web下GORM框架使用(二)

〇、前言 本文将会写一个前后端分离的的小项目&#xff0c;本文将会只实现后端。 一、定义全局变量与模型 本文需要一个数据库&#xff0c;因此将这个数据库定义为全局变量将会非常轻松。 var (DB *gorm.DB )type Todo struct {ID int json:"id"Title s…

【C#图解教程】第六章 方法(下)

输出参数 函数的输出只有返回值有时不太够&#xff0c;此时需要用到输出参数&#xff0c;用修饰词out声明 输出参数的要求与引用参数类似&#xff0c;需要是变量&#xff0c;此外&#xff0c;输出参数也是实参的别名&#xff0c;指向堆中同一对象。 输出参数与引用参数的不同在…

【实用篇】Elasticsearch03

文章目录 分布式搜索引擎031.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.2.1.Bucket聚合语法1.2.2.聚合结果排序1.2.3.限定聚合范围1.2.4.Metric聚合语法1.2.5.小结 1.3.RestAPI实现聚合1.3.1.API语法1.3.2.业务需求1.3.3.业务实现 2.自动补全2.1.拼音分词器2.2.自定义分词器2.3.…