MySQL数据库之存储引擎(下)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 一、存储引擎的概念1.1 什么是存储引擎MySQL中的数据用各种不下同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式。存储引擎是MySQL数据库中的组件,负责执行实际的数据I/O操作。MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储。


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

use 库名;
 create table 表名(字段1 数据类型,...)  engine=存储引擎名称;
复制代码


示例:

use school;
 create table teacher(id int,name varchar(10)) engine=MyISAM;   
 #指定存储引擎为MyISAM
复制代码


网络异常,图片无法展示
|


六、InnoDB行锁与索引的关系

准备一个数据表t1:

create table t1(id int primary key,name char(10),age int);
 insert into t1 values(1,'aaa',22);
 insert into t1 values(2,'bbb',23);
 insert into t1 values(3,'aaa',24);
 insert into t1 values(4,'bbb',25);
 insert into t1 values(5,'ccc',26);
 insert into t1 values(6,'zzz',27);
 alter table t1 add index name_index(name);   #对name字段创建普通索引
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


6.1 行级锁定与表级锁定

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

1)delete from t1 where id=1;

因为id字段是主键,Innodb对于主键使用了聚簇索引,删除过程中会直接锁住整行记录。行级锁定。

2)delete from t1 where name='aaa';

因为name字段是普通索引,会先锁住索引的两行(因为aaa有两行),接着会锁住相应主键对应的记录。行级锁定。

3)delete from t1 where age=23;

因为age字段没有索引,会使用全表扫描过滤,这时表上的各个记录都将加上锁。表级锁定。

6.2 死锁

死锁一般是事务相互等待对方资源,最后形成环路造成的。

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


for update: 可以为数据库中的行上一个排它锁。当一个事务的操作未完成时,其他事务可以读取该行数据,但是不能写入、更新或删除。

死锁演示:

会话1:

网络异常,图片无法展示
|


会话2:

网络异常,图片无法展示
|


会话1:

网络异常,图片无法展示
|


会话2:

网络异常,图片无法展示
|


会话1:

网络异常,图片无法展示
|


会话2:

网络异常,图片无法展示
|


6.3 如何尽可能避免死锁

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=存储引擎名称;

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
存储 缓存 关系型数据库
MySQL 存储引擎
MySQL 存储引擎
35 6
|
6天前
|
存储 缓存 关系型数据库
Mysql的两种存储引擎以及区别
Mysql的两种存储引擎以及区别
24 1
|
6天前
|
存储 消息中间件 关系型数据库
存储引擎是数据库管理系统
存储引擎是数据库管理系统
43 1
|
6天前
|
存储 关系型数据库 MySQL
Mysql第七天,存储引擎
Mysql第七天,存储引擎
68 0
Mysql第七天,存储引擎
|
6天前
|
存储 关系型数据库 MySQL
【MySQL 数据库】5、存储引擎
【MySQL 数据库】5、存储引擎
124 0
|
6天前
|
存储 关系型数据库 MySQL
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
247 0
|
6天前
|
存储 缓存 关系型数据库
MySQL - 存储引擎MyISAM和Innodb
MySQL - 存储引擎MyISAM和Innodb
|
6天前
|
存储 缓存 关系型数据库
MySQL两种存储引擎及区别
MySQL两种存储引擎及区别
28 4
MySQL两种存储引擎及区别
|
6天前
|
存储 关系型数据库 分布式数据库
数据库索引回表困难?揭秘PolarDB存储引擎优化技术
PolarDB分布式版存储引擎采用CSM方案均衡资源开销与可用性。
数据库索引回表困难?揭秘PolarDB存储引擎优化技术
|
6天前
|
存储 SQL 关系型数据库
Mysqlslap性能测试MySQL三种存储引擎
Mysqlslap性能测试MySQL三种存储引擎