MySQL数据库---存储引擎(MyISAM与InnoDB)

news2024/11/28 20:37:40

目录

  • 前言
  • 一、存储引擎概念介绍
  • 二、MyISAM
  • 三、InnoDB
  • 四、配置合适的存储引擎
  • 总结

前言

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。

一、存储引擎概念介绍

  • MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎

  • 存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式

  • MySQL常用的存储引擎:
    MyISAM
    InnoDB

-MySQL数据库中的组件,负责执行实际的数据I/O操作

-MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储

二、MyISAM

  1. MyISAM介绍
  • MyISAM不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的

  • 访问速度快,对事务完整性没有要求
    MyISAM 适合查询、插入为主的应用场景

  • MyISAM在磁盘上存储成三个文件,文件名和表名都相同,但是扩展名分别为:
    .frm 文件存储表结构的定义
    数据文件的扩展名为 .MYD (MYData)
    索引文件的扩展名是 .MYI (MYIndex)

  • 表级锁定形式,数据在更新时锁定整个表
    数据库在读写过程中相互阻塞: ————》串行操作,按照顺序操作,每次在读或写的时候会把全表锁起来
    会在数据写入的过程阻塞用户数据的读取
    也会在数据读取的过程中阻塞用户的数据写入
    特性:数据单独写入或读取,速度过程较快且占用资源相对少

  • MyIsam 是表级锁定,读或写无法同时进行
    好处是:分开执行时,速度快、资源占用相对较少(相对)

  1. MyISAM 表支持 3 种不同的存储格式:
    (1)静态(固定长度)表
    静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。
    固定长度10
    存储非常迅速,容器缓存,故障之后容易恢复
    id(5) char(10)
    000000001
    (2)动态表
    动态表包含可变字段(varchar),记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行 OPTIMIZE TABLE 语句或 myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难。
    (3)压缩表
    压缩表由 myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。
  2. MyISAM适用的生产场景
    公司业务不需要事务的支持

单方面读取或写入数据比较多的业务

MyISAM存储引擎数据读写都比较频繁场景不适合

使用读写并发访问相对较低的业务

数据修改相对较少的业务

对数据业务一致性要求不是非常高的业务

服务器硬件资源相对比较差

MyIsam:适合于单方向的任务场景、同时并发量不高、对于事务要求不高的场景

三、InnoDB

除了 MyISAM 存储引擎,MySQL 中另一个常用的存储引擎是 InnoD

  1. InnoDB 的介绍
  • InnoDB 存储引擎不同于 MyISAM 存储引擎,能够支持事务安全镖(ACID 兼容),具有提交、回滚和崩溃恢复的能力
  • InnoDB 支持行级锁定,并且可以在 SELECT 语句中提供一个与 Oracle 风格类似的非锁定读,也支持 FOREIGN KEY 强制
  • 种种特性使得 InnoDB 存储引擎的多用户部署和性能得以提升
  • InnoDB 存储引擎还支持 SQL 查询中将 InnoDB 类型的表与其他 MySQL 的表类型混合使用,甚至在同一个查询中也可以混合使用
  • InnoDB 是为处理巨大数据量时的最大性能而设计的
  • 它的 CPU 效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的
  • InnoDB 存储引擎被完全与 MySQL 服务器整合,为在内存中缓存数据和索引而维持它自己的缓冲池
    InnoDB 在一个表空间中存储它的表与索引,表空间可以包含数个文件(或原始磁盘分区)
    这与 MyISAM 不同,比如在 MyISAM 表中每个表被存储在分离的文件中
    InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为 2GB 的操作系统上也无影响
  1. InnoDB的 特点
    支持事务,支持四个事务隔离级别
    行级锁定,但是全表扫描仍然会是标记锁定
    读写阻塞与事务隔离级别相关
    具有非常高效的缓存特性,能缓存索引,也能缓存数据
    表与主键以簇的方式存储
    支持分区、表空间,类似 Oracle 数据库
    支持外键约束,MySQL 5.5 以前不支持全文索引,5.5 版本以后支持
    适合对硬件资源要求比较高的场合
  2. InnoDB 适用的生产场景

根据 InnoDB 的特点,在下面的场景中需要选择适用 InnoDB 存储引擎

  • 业务需要事务的支持
  • 行级锁定对高并发有很好的适应能力,但需要确保查询时通过索引来完成
  • 业务数据更新较为频繁的场景,如论坛、微博等
  • 业务数据一致性要求较高,例如银行业务
  • 硬件设备内存较大,利用 InnoDB 较好的缓存能力来提高内存利用率,减少磁盘 IO 的压力
  1. 企业选择存储引擎的依据

选择哪种存储引擎,应根据企业系统的实际需要,考虑每个存储引擎提供了哪些不同的核心功能及应用的常见
主要依据以下几个方面来决定:

1)存储引擎支持的字段和数据类型
①所有的引擎都支持通用的数据类型,但不是所有的引擎都支持其他的字段类型
②如二进制对象

2)锁定类型
①不同的存储引擎支持不同级别的锁定
②表锁定:MyISAM 支持
③行锁定:InnoDB 支持

3)索引的支持
①建立索引在搜索和恢复数据库中的数据时能够显著提高性能
②不同的存储引擎提供不同的制作索引的技术
③有些存储引擎根本不支持索引

4)事务处理的支持
①事务处理功能提供向表中更新和插入信息期间的可靠性
②可根据企业业务是否要支持事务选择存储引擎

  1. 小结
  • InnoDB 中不保存表的行数,需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可
  • 需要注意的是,当"count( )"语句包含 where 条件时,MyISAM 也需要扫描整个表
  • 对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中可以和其他字段一起建立组合索引
  • 清空整个表时,InnoDB 是一行一行的删除,效率非常慢;而MyISAM 则会重建表

四、配置合适的存储引擎

  • 选择了合适的存储引擎之后,就可以修改为相应的存储引擎类型,修改的步骤如下:
    1.查看数据库可配置的存储引擎类型
    2.查看表正在使用的存储引擎类型
    3.配置存储引擎为所选择的类型
  1. 查看数据库可配置的存储引擎类型
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------
+--------------+------+------------+| Engine             | Support | Comment                                                        
| Transactions | XA   | Savepoints |+--------------------+---------+----------------------------------------------------------------
+--------------+------+------------+| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     
| YES          | YES  | YES        || MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          
| NO           | NO   | NO         || MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      
| NO           | NO   | NO         || BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) 
| NO           | NO   | NO         || MyISAM             | YES     | MyISAM storage engine                                          
| NO           | NO   | NO         || CSV                | YES     | CSV storage engine                                             
| NO           | NO   | NO         || ARCHIVE            | YES     | Archive storage engine                                         
| NO           | NO   | NO         || PERFORMANCE_SCHEMA | YES     | Performance Schema                                             
| NO           | NO   | NO         || FEDERATED          | NO      | Federated MySQL storage engine                                 
| NULL         | NULL | NULL       |


在这里插入图片描述

参数解释
Engine当前版本的 MySQL 所支持的引擎类型
Support对应引擎是否能使用,DEFAULT 指默认值
Comment存储引擎的简要说明
Transactions对应引擎是否支持事务
XA存储引擎是否支持XA事务
Savepoints存储引擎是否支持保存点
  1. 查看表正在使用的存储引擎类型

2.1 方式一

#####格式
show table status from 库名 where name = '表名'\G;
#加\G能竖向查看,不加则是横向

#例:
mysql> show table status from zone where name='dsj'\G;
*************************** 1. row ***************************
           Name: dsj
         Engine: InnoDB		//引擎为innodb
        Version: 10
     Row_format: Dynamic
           Rows: 6
 Avg_row_length: 2730
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2021-10-24 13:37:02
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.01 sec)

ERROR: 
No query specified

2.2 方式二

use 库名;
show create table 表名;


例:
mysql> use zone;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show create table dsj\G;
*************************** 1. row ***************************
       Table: dsj
Create Table: CREATE TABLE "dsj" (
  "id" int(11) NOT NULL,
  "name" char(10) NOT NULL,
  "score" decimal(5,0) DEFAULT NULL,
  "passwd" char(48) DEFAULT '',
  PRIMARY KEY ("id")
) ENGINE=InnoDB DEFAULT CHARSET=utf8		//引擎为InnoDB
1 row in set (0.00 sec)

ERROR: 
No query specified

  1. 配置存储引擎为所选择的类型

方法一

通过使用 alter table 命令修改

use 库名;
alter table 表名 engine=MyISAM;


例:
mysql> use zone;	
Database changed
mysql> alter table dsj engine=MyISAM;	//设置引擎为MyISAM

mysql> show create table dsj\G;		//查看表结构
*************************** 1. row ***************************
       Table: dsj
Create Table: CREATE TABLE "dsj" (
  "id" int(11) NOT NULL,
  "name" char(10) NOT NULL,
  "score" decimal(5,0) DEFAULT NULL,
  "passwd" char(48) DEFAULT '',
  PRIMARY KEY ("id")
) ENGINE=MyISAM DEFAULT CHARSET=utf8	//引擎已经被修改为
1 row in set (0.00 sec)

ERROR: 
No query specified

方法二
通过修改 MySQL 的配置文件 my.cnf,可以指定 default-storage-engine 选项设置默认的存储引擎

vim /etc/my.cnf
[mysqld]
default-storage-engine=INNODB

systemctl restart mysql.service
#一定记得重启服务以让修改的配置生效

#注:此方法只针对新建的表,对以前已存在的表没有影响,即不会修改之前表的存储引擎类别

在这里插入图片描述
方法三
通过使用 create table 创建表时用 engine 指定存储引擎,会使用指定的存储引擎

use 库名;
create table 表名(字段1 数据类型,...) engine=MyISAM;


#例:
mysql> use zone;	//切换库

mysql> create table lion (name varchar(10),age char(4))engine=myisam;	//创建表指定引擎
Query OK, 0 rows affected (0.00 sec)

mysql> show create table lion\G;	//查看表结构
*************************** 1. row ***************************
       Table: lion
Create Table: CREATE TABLE "lion" (
  "name" varchar(10) DEFAULT NULL,
  "age" char(4) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8		//引擎为myisam
1 row in set (0.00 sec)

ERROR: 
No query specified


总结

  • MyISAM
    不需要事务支持(不支持)
    并发相对较低(锁定机制问题)
    数据修改相对较少(阻塞问题),以读为主
    数据一致性要求不是非常高

  • InnoDB
    需要事务支持(具有较好的事务特性)
    行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成
    数据更新较为频繁的场景
    数据一致性要求较高
    硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘 IO

  • 两者最大的区别是Innodb支持事务处理与外键和行级锁,而MyISAM不支持

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

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

相关文章

Vue中如何进行图像识别与人脸对比

Vue中如何进行图像识别与人脸对比 随着人工智能的发展,图像识别和人脸识别技术已经被广泛应用于各种应用程序中。Vue作为一种流行的前端框架,提供了许多实用工具和库,可以帮助我们在应用程序中进行图像识别和人脸识别。在本文中,…

docker换源(docker镜像源)pull超时(pull镜像超时)/etc/docker/daemon.json

文章目录 pull了n次都超时&#xff0c;也是醉了更换镜像源步骤1. 打开终端并以管理员身份登录到Docker主机。2. 编辑Docker配置文件daemon.json。该文件用于配置Docker守护进程的参数。3. 在daemon.json文件中添加以下内容&#xff0c;将<镜像源地址>替换为您选择的镜像源…

基于matlab仿真具有不同传感器模式的锥形阵列(附源码)

一、前言 此示例说明如何在不同的阵列配置上应用锥形和模型细化。它还演示了如何创建具有不同元素模式的数组。 二、ULA 逐渐变细 本节介绍如何在均匀线性阵列 &#xff08;ULA&#xff09; 的元素上应用泰勒窗口以降低旁瓣电平。 比较锥形阵列和非锥形阵列的响应。请注意锥形U…

外部局域网直接访问WSL2

1. 开启hyper-v 1、首先&#xff0c;进入控制面板—程序—启用或关闭windows功能&#xff0c;勾选hyper-v&#xff0c;确认后重启电脑。2、打开 Windows PowerShell&#xff0c;输入 systeminfo 命令 能够看到出现了很多处理器的信息&#xff0c;最末尾有个 Hyper-V 要求&…

Redis 2023面试5题(一)

一、Redis是单线程还是多线程 在面试中&#xff0c;当被问到Redis是单线程还是多线程这个问题时&#xff0c;可以按照以下思路进行回答&#xff1a; 首先&#xff0c;Redis的核心业务部分是单线程的&#xff0c;即命令处理部分是单线程的。然而&#xff0c;Redis也支持多路复…

Java---第四章(数组基础,冒泡排序,二分查找,多维数组)

Java---第四章 一 数组基本知识数组操作 二 数组实操数组排序二分查找二维数组 一 数组 基本知识 概念&#xff1a; 数组是编程语言中的一种常见的数据结构&#xff0c;能够存储一组相同类型的数据 作用&#xff1a; 存储一组相同类型的数据&#xff0c;方便进行数理统计&am…

springboot3生命周期监听的使用和源码解析

定义SpringApplicationRunListener来监听springApplication的启动 1.通过实现springApplicationRunListener来实现监听。 2.在 META-INF/spring.factories 中配置 org.springframework.boot.SpringApplicationRunListener自己的Listener。 在默认的springboot配置中就有给我…

视觉SLAM十四讲——ch12实践(建图)

视觉SLAM十四讲——ch12的实践操作及避坑 0.实践前小知识介绍1. 实践操作前的准备工作2. 实践过程2.1 单目稠密重建2.2 RGB-D稠密建图2.3 点云地图2.4 从点云重建网格2.5 八叉树地图 3. 遇到的问题及解决办法3.1 cmake ..时&#xff0c;出现opencv版本问题3.2 make -j8时&#…

使用腾讯云服务器从零搭建个人网站

前期准备工作 1.服务器重装系统 选择ubuntu18的系统镜像 2.开放端口 需要开放80&#xff0c;27017&#xff0c;3000&#xff0c;22端口 80端口用于配置nginx服务27017端口用于连接mongondb数据库3000端口是启动项目的端口22端口用于ssh远程连接服务器&#xff0c;一般默认会…

SpringBoot - @Transactional注解详解

简介 Spring中的Transactional注解&#xff0c;基于动态代理的机制&#xff0c;提供了一种透明的事务管理机制&#xff0c;方便快捷的解决在开发中碰到的问题&#xff0c;Transactional 的事务开启 &#xff0c;或者是基于接口的或者是基于类的代理被创建。Spring为了更好的支…

数据库SQL查询(二)之连接查询

本文介绍SQL查询&#xff0c;如何在海量数据中筛选想要数据&#xff1b; 数据库管理系统选择&#xff1a;关系型数据库mysql 数据库管理工具选择&#xff1a;navicat 本文中查询语句和查询案例参考自&#xff1a;https://edu.csdn.net/course/detail/27673?ops_request_mis…

python django vue httprunner 实现接口自动化平台(最终版)

一、项目介绍&#xff1a; 1.1 项目地址 前端地址&#xff1a; GitHub - 18713341733/test_platform_service: django vue 实现接口自动化平台 后端地址&#xff1a; GitHub - 18713341733/test_platform_front: Django vue实现接口自动化平台 1.2 项目介绍 1.2.1 环境…

在 K8S 中部署一个应用 上

本身在 K8S 中部署一个应用是需要写 yaml 文件的&#xff0c;我们这次简单部署&#xff0c;通过拉取网络上的镜像来部署应用&#xff0c;会用图解的方式来分享一下&#xff0c;过程中都发生了什么 简单部署一个程序 我们可以通过 kubectl run 的方式来简单部署一个应用&#…

Python深度学习027:什么是梯度、梯度消失、梯度爆炸以及如何解决

文章目录 1. 梯度的概念2. 梯度更新中存在的问题2.1 梯度消失2.2 梯度爆炸3. 解决办法3.1 梯度消失3.2 梯度爆炸1. 梯度的概念 在机器学习中,梯度是指一个多元函数在某一点处的变化率以及变化的方向。 对于一个参数化的函数,梯度可以告诉我们在一个特定的点处函数值增加最快…

分布式系统概念和设计——Mach实例研究

分布式系统概念和设计 Mach实例研究 Mach主要抽象概述 任务 一个Mach任务是一个执行环境主要包括一个被保护的地址空间和一个内存管理的权能集合这些权能主要用于访问端口 线程 任务可以包含多个线程在共享内存的多处理器中&#xff0c;属于同一个任务的线程可以在不同的处理…

【案例实战】SpringBoot整合Redis实现缓存分页数据查询

正式观看本文之前&#xff0c;设想一个问题&#xff0c;高并发情况下&#xff0c;首页列表数据怎么做&#xff1f; 类似淘宝首页&#xff0c;这些商品是从数据库中查出来的吗&#xff1f;答案肯定不是&#xff0c;在高并发的情况下&#xff0c;数据库是扛不住的&#xff0c;那么…

Java解析XML文件(DOM4J解析xml文件)

内容重点1&#xff1a;DOM4J创建、解析、修改XML文件 内容重点2&#xff1a;DOM4J模拟解析web.xml配置文件&#xff0c;实现实例化servlet 1、什么是xml Xml(Extensible Markup Language) 一种扩展性标示语言,出现的意义其实与JSON字符串的意义相似,是新一代的数据交换标准…

怎么加密共享文件夹?局域网共享文件夹加密方法

相信很多企业都在使用局域网共享文件夹&#xff0c;它可以很方便地实现各部门之间的沟通协作。但是由于使用人员众多&#xff0c;数据安全非常难以得到保障。那么我们该怎么加密局域网共享文件夹呢&#xff1f; 共享文件夹加密 首先&#xff0c;我们先来了解一下共享文件夹加密…

某农业大学数据结构A-第13周作业

1.拓扑排序 【问题描述】 拓扑排序的流程如下&#xff1a; 1. 在有向图中选一个没有前驱的顶点并且输出之&#xff1b; 2. 从图中删除该顶点和所有以它为尾的弧。 重复上述两步&#xff0c;直至全部顶点均已输出&#xff0c;或者当前图中不存在无前驱的顶点为止。后一种情况则…

渲染模式差异和选择

传统服务端渲染 在过去传统开发中&#xff0c;页面渲染任务是由服务端完成的&#xff0c;服务器负责获取数据&#xff0c;拼装页面&#xff0c;客户端仅负责内容显示&#xff0c;使用这种方式的典型技术有 JSP、PHP、ASP.NET 等等。 客户端渲染 CSR Vue.js、React 这类框架之…