Mysql事务以及InnoDB和MyISAM区别讲解

Wesley13
• 阅读 175

【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,博客昵称是希望自己能不断精进,向着优秀程序员前行!

博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!

吾等采石之人,应怀大教堂之心,愿你们奔赴在各自的热爱中…

文章目录

      • 一、数据库事务简介
      • 二、InnoDB 和 MyISAM
      • 三、MYSQL引擎简介

一、数据库事务简介

写这篇文章初衷是有一个大佬告诉我,他面试第一个问题就喜欢问InnoDB和MyISAM区别,所以想了想抽时间整理一下相关内容,哈哈欢迎阅读!

要讲解InnoDB,MyISAM 首先一定要知道数据库事务!

Mysql事务以及InnoDB和MyISAM区别讲解
数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

事务特性(ACID)

A: Atomicity, 原子性:事务是最小的操作序列单元,一个事务中包含的所有操作在一次执行后要么全部操作成功,要么全部操作失败,也就是说如果事务执行过程中出错,那么就会回滚到事务开始前的状态

C: Consistency, 一致性:指事务的执行不能破坏数据库数据的完整性和一致性,例如A向B转账,如果事务中只给B的账户增加了余额而A的余额不变,那么就破坏了数据的一致性

I: Isolation, 隔离性:不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间,不应互相干扰

D: Duration, 持久性:事务一旦提交,对数据的修改便被永久保留


例:打个很简单的比方,我辰兮购买CSDN会员花费300元

整体执行算是一个事务,首先我的余额减少300,然后CSDN账户余额增加300
如果我支付成功这里我的账户余额就会少,但是如果这时候突然出现异常情况,这时候CSDN账户没有增加300,那么这个业务就算是失败的,事务的原子性和一致性就提到要不全部执行,要不就不执行,如果执行一半事务一致性也会破坏


例:常见比如你要删除一个用户的信息,肯定是删除用户表信息,用户详情表信息

删除相关信息就要删除的彻彻底底,你执行一个事务就要将这个事务执行完整,业务逻辑也要符合实际场景,这才合情合理

总结:事务是由一系列对数据的访问与更新操作组成的程序执行逻辑单元


二、InnoDB 和 MyISAM

面试中也经常考到InnoDB和MyISAM区别?

Mysql事务以及InnoDB和MyISAM区别讲解

1、InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;

2、 InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;

3、InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

4、 InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;

5、InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;

注意:目前 MySQL 将默认存储引擎 InnoDB,支持事务,支持行锁支持外键


根据实际场景选择不同的数据库引擎:

1.是否要支持事务,如果要请选择 InnoDB,如果不需要可以考虑 MyISAM;

2. 如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读写也挺频繁,请使用InnoDB。

3. 系统奔溃后,MyISAM恢复起来更困难,能否接受,不能接受就选 InnoDB;

4.MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的。

根据自己实际的场景选择不同的数据库即可,如果你不知道用什么存储引擎,那就用InnoDB吧,毕竟是mysql目前默认引擎。


三、MYSQL引擎简介

上面的InnoDB和MyISAM都是MYSQL引擎,我们是否真正了解过引擎概念呢?

Mysql事务以及InnoDB和MyISAM区别讲解

简介一下MYSQL引擎相关知识:

MYSQL存储数据时,有不同的存储方式,这些方式都使用了不同的底层实现(如:存储机制,索引技巧,索引技巧,锁定水平),底层实现的差异带来的功能也就不同。在不同的场景下使用合适的存储方式就能让你的数据读写速度更快或者获得额外的功能。


MYSQL主要有什么存储引擎?

主要的有: MyIsam , InnoDB, Mrg_Myisam, Memory, Blackhole, CSV, Performance_Schema, Archive, Federated

数据库查询语句中可用通过 show engines 查看你的MYSQL的存储引擎
Mysql事务以及InnoDB和MyISAM区别讲解


拓展:【数据库】Mysql更改默认引擎为Innodb的步骤方法

InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。

基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。

我为什么要改默认引擎,其实原因很简单,我使用的Mysql默认引擎是MyISAM,而MyISAM并不支持事务处理,所以我需要更换它的引擎。

更改 Mysql 默认引擎为 InnoDB步骤如下:

Mysql默认是关闭InnoDB存储引擎的使用的,将InnoDB设置为默认的引擎如下。

1. 查看Mysql存储引擎情况: mysql>show engines InnoDB | YES,说明此Mysql数据库服务器支持InnoDB引擎。

2. 设置InnoDB为默认引擎:在配置文件my.ini中的 [mysqld] 下面加入default-storage-engine=INNODB

3. 重启Mysql服务器

4. 登录Mysql数据库,mysql>show engines 如果出现 InnoDB |DEFAULT,则表示设置InnoDB为默认引擎成功。


The best investment is to invest in yourself.

Mysql事务以及InnoDB和MyISAM区别讲解

2020.12.13 晚22:52 愿你们奔赴在自己的热爱里!

点赞
收藏
评论区
推荐文章
Jacquelyn38 Jacquelyn38
1年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
1年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序selectfromtable_nameorderiddesc;2.按照指定(多个)字段排序selectfromtable_nameorderiddesc,statusdesc;3.按照指定字段和规则排序selec
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
京东云开发者 京东云开发者
2个月前
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
3A网络 3A网络
4个月前
开发一个不需要重写成 Hive QL 的大数据 SQL 引擎
开发一个不需要重写成HiveQL的大数据SQL引擎学习大数据技术的核心原理,掌握一些高效的思考和思维方式,构建自己的技术知识体系。明白了原理,有时甚至不需要学习,顺着原理就可以推导出各种实现细节。各种知识表象看杂乱无章,若只是学习
3A网络 3A网络
4个月前
理解 virt、res、shr 之间的关系(linux 系统篇)
理解virt、res、shr之间的关系(linux系统篇)前言想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过t
helloworld_34035044 helloworld_34035044
6个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为