Mysql存储引擎总结

举报
LoneWalker、 发表于 2023/08/18 10:03:53 2023/08/18
【摘要】 Mysql存储引擎总结

一、什么是存储引擎以及Mysql支持的存储引擎

MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)

SHOW ENGINES来看一下Mysql支持哪些存储引擎20210219101840182.png

在Mysql5.5版本之后,使用InnoDB作为默认引擎,它支持事务,行级锁和外键。Mysql中的存储引擎是针对表的,可以对不同的表使用不同的存储引擎。


二、锁

在分析存储引擎之前,先看一下锁

锁的分类     

①从对数据操作的类型(读\写)分为:

  • 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。       
  • 写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。     

②从对数据操作的粒度分为:      

表锁 :偏向MyISAM存储引擎,开销小,加锁块;无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

行锁 : 偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率最低,并发度最高。

页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用; 而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。

三、InnoDB

InnoDB是一种事物存储引擎,完全支持事物的ACID特性,它是使用日志来保证事物的,也就是Redo log(重做日志) 和 Undo log(回滚日志)。

Redo log主要存储已经提交的事务,而Undo log主要存储还未提交的事务。

InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描

支持行级锁,行级别锁可以最大程度支持并发,行级锁是由存储引擎层来实现的

引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。

四、MyIsAM

如果应用是以查询操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。

MyIsAM存储引擎mysql会创建3个文件:

  • FRM文件是所有存储引擎都会创建的,用来记录表结构。
  • MYD是来记录存储的数据。
  • MYI用来记录索引数据。

MyISAM支持对任意意外关闭所损坏的表的检查和修复,这里的修复并不是通过事物来修复的,因为MyISAM不支持事物,有可能造成数据的丢失

check table tablename 检查表

repair table tablename 修复表

五、Memory

将数据存在内存,为了提高数据的访问速度,每一个表实际上和一个磁盘文件关联。文件是frm

支持的数据类型有限制,比如:不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型;

支持的锁粒度为表级锁。所以,在访问量比较大时,表级锁会成为MEMORY存储引擎的瓶颈;

由于数据是存放在内存中,一旦服务器出现故障,数据都会丢失;

查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低;

默认使用hash索引。如果一个内部表很大,会转化为磁盘表。

六、总结

20210219110643885.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。