当前位置: 首页 > news >正文

mysql数据库之存储引擎

内容预知

 1.mysql存储引擎的相关知识

1.1 存储引擎的概念 

1.2 存储引擎的分类

2.  MyISAM和InnoDB

2.1 MyISAM存储引擎 

2.1.1 MyISAM的相关了解 

2.1.2 MyISAM的特点

2.1.3 MyISAM表支持3种不同的存储格式

2.2 InnoDB存储引擎 

2.2.1  InnoDB的相关了解

2.2.2 InnoDB的特点

2.2.3  InnoDB适用生产场景分析

2.3  MyISAM和InnoDB的区别

2.4 企业级运用引擎选择 

 3.Mysql存储引擎的管理

3.1 存储引擎的查看 

(1)查询当前数据库支持的存储引擎

(2)查看当前的默认存储引擎 

(3)查看指定表的存储引擎 

3.2 存储引擎的修改 

(1)创建表时直接指定 

(2)直接修改表结构中的存储引擎 

(3)修改默认的存储引擎 

4. InnoDB的索引和锁的关系

4.1 InnoDB 行锁 演示

4.2 InnoDB 表锁演示 

4.3 死锁演示

避免死锁的解决方案 

 总结

MyISAM和InnoDB的区别:

查看系统支持的存储引擎:

查看表使用的存储引擎:

修改存储引擎:


 1.mysql存储引擎的相关知识

1.1 存储引擎的概念 

  • MySQL中的数据用各种不下同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。
  • 存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式。
  • 存储引擎是MySQL数据库中的组件,负责执行实际的数据I/O操作。
  • MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储。

1.2 存储引擎的分类

MyISAM:Mysql 5.5之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务;

InnoDB:事务型速记的首选引擎,支持ACID事务,支持行级锁定,MySQL5.5成为默认数据库引擎;

Memory: 所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在MYSQL重新启动是会丢失;

Archive :非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive 拥有高效的插入速度,但其对查询的支持相对较差;

Federated :将不同的 MySQL 服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用;

CSV :逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个 .csv 文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV 存储引擎不支持索引。

BlackHole: 黑洞引擎,写入的任何数据都会消失,一般用于记录 binlog 做复制的中继;

ERFORMANCE_SCHEMA存储引擎该引擎主要用于收集数据库服务器性能参数;

Mrg_Myisam Merge存储引擎,是一组MyIsam的组合,也就是说,他将MyIsam引擎的多个表聚合起来,但是他的内部没有数据,真正的数据依然是MyIsam引擎的表中,但是可以直接进行查询、删除更新等操作;

2.  MyISAM和InnoDB

2.1 MyISAM存储引擎 

2.1.1 MyISAM的相关了解 

  • MylSAM不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的。

  • 访问速度快,对事务完整性没有要求。

  • MylSAM适合查询、插入为主的应用。

  • MylSAM在磁盘.上存储成三个文件,文件名和表名都相同,但是扩展名分别为:

    • .frm文件存储表结构的定义
    • 数据文件的扩展名为.MYD (MYData)
    • 索引文件的扩展名是.MYI (MYIndex)

2.1.2 MyISAM的特点

1)表级锁定形式,数据在更新时锁定整个表

2)数据库在读写过程中相互阻塞:

会在数据写入的过程阻塞用户数据的读取

也会在数据读取的过程中阻塞用户的数据写入数据单独写入或读取,速度过程较快且占用资源相对少。

2.1.3 MyISAM表支持3种不同的存储格式

(1)静态(固定长度)表

静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。

(2)动态表

动态表包含可变字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行OPTIMIZE TABLE语句或myisamchk-r命令来改善性能,并且出现故障的时候恢复相对比较困难(因为会产生磁盘碎片,而且存储空间不是连续的)。

(3)压缩表

压缩表由 myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。(压缩的过程中会占用CPU性能

2.2 InnoDB存储引擎 

2.2.1  InnoDB的相关了解

  • 支持事务,支持4个事务隔离级别

  • MySQL从5.5.5版本开始,默认的存储引擎为InnoDB

  • 读写阻塞与事务隔离级别相关

  • 能非常高效的缓存索引和数据

  • 表与主键以簇的方式存储 BTREE

  • 支持分区、表空间,类似oracle数据库

  • 支持外键约束,5.5前不支持全文索引,5.5后支持全文索引

  • 对硬件资源要求还是比较高的场合

  • 行级锁定,但是全表扫描仍然会是表级锁定

 注意:

  • 使用like进行模糊查询时,会进行全表扫描,锁定整个表。
  • 对没有创建索引的字段进行查询,也会进行全表扫描锁定整个表。
  • 使用索引进行查询,则是行级锁定。

2.2.2 InnoDB的特点

InnoDB中不保存表的行数,如 select count(*) from table; 时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。需要注意的是当count(*)语句包含where条件时MyISAM也需要扫描整个表。

对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立组合索引。

delete清空整个表时,InnoDB 是一行一 行的删除,效率非常慢。MyISAM则会重建表。

2.2.3  InnoDB适用生产场景分析

  • 业务需要事务的支持。

  • 行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成。

  • 业务数据更新较为频繁的场景。

    • 如:论坛,微博等。
  • 业务数据一致性要求较高。

    • 如:银行业务。
  • 硬件设备内存较大,利用InnoDB较好的缓存能力来提高内存利用率,减少磁盘IO的压力。

2.3  MyISAM和InnoDB的区别

MyISAM:不支持事务和外键约束,占用资源较小,访问速度快,表级锁定,支持全文索引,适用于不需要事务处理,单独写入或查询的应用场景。 存储格式: 表名.frm(表结构文件)  表名.MYD(数据文件)   表名.MYI(索引文件)

InnoDB:支持事务处理、外键约束,缓存能力较好,支持行级锁定,读写并发能力较好,5.5版本后支持全文索引,适用于一致性要求高、数据更新频繁的应用场景。表名.frm(表结构文件)  表名.idb(表数据文件/索引文件)  db.opt(表属性文件)

功能MyISAMInnoDB
存储限制256TB64TB
事务不支持支持
全文索引支持不支持
B树索引支持支持
哈希索引不支持不支持
集群索引不支持支持
数据索引不支持支持
数据压缩支持不支持
空间使用率
外键不支持支持

2.4 企业级运用引擎选择 

1、需要考虑每个存储引擎提供了哪些不同的核心功能及应用场景。

2、支持的字段和数据类型

  • 所有引擎都支持通用的数据类型
  • 但不是所有的弓|擎都支持其它的字段类型,如二进制对象.

3、锁定类型:不同的存储引擎支持不同级别的锁定

  • 表锁定:MyISAM 支持
  • 行锁定:InnoDB 支持

 3.Mysql存储引擎的管理

3.1 存储引擎的查看 

(1)查询当前数据库支持的存储引擎

show engines;

(2)查看当前的默认存储引擎 

show variables like '%storage_engine%';

 

(3)查看指定表的存储引擎 

show create table 表名;

 

3.2 存储引擎的修改 

(1)创建表时直接指定 

create table 表名(...) engine=引擎名;

(2)直接修改表结构中的存储引擎 

alter table 表名 engine = 引擎名称;

(3)修改默认的存储引擎 

修改默认的存储引擎后,对已经创建好的表的存储引擎没有影响,影响的是新建的表。 

  (1) 找到mysql安装目录下的模块主配置文件: 
  (2) 找到default-storage-engine=INNODB 改为目标引擎,
           default-storage-engine=MYISAM 
            重启mysqld服务

 

创表验证:

 

4. InnoDB的索引和锁的关系

 InnoDB行锁是通过给索引项加锁来实现的,如果没有索引,InnoDB将通过隐藏的聚簇索引来对记录加锁(一般称为表锁)。

测试表准备:

create table if not exists  student(
    id int(5),
    name char(8),
    age int(3),
    sex char(2) );


同时添加了一个主键id   一个普通索引name_index(name)
alter table student add primary key(id);
alter table student add index name_index(name);

 

数据插入:

 

insert into student values(1,'小明',18,'男');
insert into student values(2,'小红',19,'女');
insert into student values(3,'小刚',19,'男');
insert into student values(4,'小绿',17,'女');
insert into student values(5,'小黑',20,'男');

 

 

 

4.1 InnoDB 行锁 演示

 

事务A: 

 

 

 

 

 

事务B: 

 

 

 

4.2 InnoDB 表锁演示 

 事务A:

 

事务B: 

 

4.3 死锁演示

 行锁如果使用不当会导致死锁(死锁一般是事务相互等待对方释放资源,最后形成环路造成的)

 

事务A事务B
begin;begin;
delete from student where id=2;#事务结束前,id=2的行会被锁定
select * from t1 where id=1 for update; #加排他锁,模拟并发情况,锁定id=1的行
delete from t1 where id=1; #死锁产生
update t1 set name='abc' where id=2; #死锁产生。因为会话1中id=5的行还在删除过程中,该行已被锁定
rollback; #回滚,结束事务。id=5的行被解锁
update t1 set name='abc' where id=2; #成功更新数据

 

 事务A:

 

事务B:

 

 

事务A:

 

 

 

 

 

 

 

 

 

避免死锁的解决方案 

1.使用更合理的业务逻辑,以固定的顺序访问表和行。

2、大事务拆小。大事务更倾向于死锁,如果业务允许,将大事务拆小。

3、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概率。

4、降低隔离级别。如果业务允许,将隔离级别调低也是较好的选择,比如将隔离级别从RR调整为RC,可以避免掉很多因为gap锁造成的死锁。

5、为表添加合理的索引。如果不使用索引将会为表的每一行记录添加上锁,死锁的概率大大增加。

 

 总结

MyISAM和InnoDB的区别:

MyISAM: 不支持事务和外键约束,占用空间较小,访问速度快,表级锁定,适用于不需要事务处理、单独写入或查询的应用场景。(写入和查询不一起使用的场景)

InnoDB: 支持事务处理、外键约束、占用空间比MyISAM 大,支持行级锁定,读写开发能力较好,适用于需要事务处理、读写频繁的应用场景。

查看系统支持的存储引擎:

show engines;

查看表使用的存储引擎:

方法一:show table status from 库名 where name='表名'\G

方法二:show create table 表名;

修改存储引擎:

方法一:修改已存在的表使用的存储引擎

alter table 表名 engine=存储引擎名称;

方法二:修改配置文件,指定默认存储引擎

vim /etc/my.cnf

[mysqld]

default-storage-engine=InnoDB #修改这一行,指定默认存储引擎为InnoDB

systemctl restart mysqld #重启服务

方法三:创建表时指定存储引擎

create table 表名(字段1 数据类型,...) engine=存储引擎名称;

 

相关文章:

  • C++ STL中的allocator
  • GitHub提交代码超时解决方案 | 配置SSH连接
  • 火山引擎 RTC 全球化架构设计
  • 软考知识点---13语言处理程序基础
  • 生成keystore以及导出keystore公钥,私钥信息
  • 黑马学SpringCloud-Feign
  • 基于springboot的校园二手网站
  • 对于一个即将上线的网站,如何测试
  • 手把手教你搭建SpringCloudAlibaba之Nacos服务集群配置
  • 【数据分析】多重分形去趋势波动分析附matlab代码
  • Spring Cloud LoadBalancer--负载均衡的原理(源码分析)
  • Prometheus基础概念介绍
  • SDNU_ACM_ICPC_2022_Weekly_Practice_1rd「个人赛」题解
  • 4种数据仓库建模方法
  • 离线数仓 (八) --------- 数仓分层
  • 深入了解以太坊
  • CSS 专业技巧
  • Java IO学习笔记一
  • Java,console输出实时的转向GUI textbox
  • Js基础知识(四) - js运行原理与机制
  • node.js
  • React的组件模式
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 解析 Webpack中import、require、按需加载的执行过程
  • 学习使用ExpressJS 4.0中的新Router
  • 用element的upload组件实现多图片上传和压缩
  • 中文输入法与React文本输入框的问题与解决方案
  • 转载:[译] 内容加速黑科技趣谈
  • 自制字幕遮挡器
  • Hibernate主键生成策略及选择
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $.ajax()参数及用法
  • (6)设计一个TimeMap
  • (9)STL算法之逆转旋转
  • (TOJ2804)Even? Odd?
  • (分布式缓存)Redis哨兵
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (一)基于IDEA的JAVA基础10
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET6实现破解Modbus poll点表配置文件
  • /proc/stat文件详解(翻译)
  • :=
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [c++] 自写 MyString 类
  • [C++]C++基础知识概述
  • [HackMyVM]靶场Crossbow
  • [hive] 窗口函数 ROW_NUMBER()
  • [html] 动态炫彩渐变背景