mysql--MyISAM存储引擎和 Innodb存储引擎的介绍及特点

存储引擎是影响数据库性能的重要因素
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190516221201200.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTc0Njg0,size_16,color_FFFFFF,t_7
MyISAM存储引擎和innodb存储引擎的特点
MyISAM存储引擎
mysql中大部分系统表和临时表的存储引擎是MyISAM,这里的临时表不是用户在使用create table 表名创建的临时表,对于这种方式创建的表可以使用msql支持的任何存储引擎,这里的临时表指的是在排序等操作上,当数量超过一定的大小之后由查询优化器创建的临时表。
MyISAM存储引擎会将表存储在MYD,MYI,frm文件中,MYD文件中保存了数据,MYI文件中保存了索引,frm文件中记录了表的结构,这个文件并不是只有M有ISAM存储文件才有
在这里插入图片描述
MyISAM的特性:
从并发行和锁级别上看,使用的是表级锁而不是行级锁,进行修改的时候要进行加锁,进行读取的时候要加上共享锁,使用M有ISAM存储引擎的锁读取和 写入是互斥的,但是对一些数据进行读取的时候,也可以在表的末尾插入数据,总之对读写混合的并发来说不是很好,
从表的损坏和修复上看,由于任意的意外关闭进行检查和修复,这里的修复指的不是事务恢复,因为不具有事务,没有事务修复的相关日志,可以通过checktable对表进行检查,通过repair表名对表进行修复,在对表的修复的时候可能会出现数据的丢失
check table 表名,可以对表进行检查
repair table 表名,可以对表进行修复
在这里插入图片描述
MyISAM表是支持的索引类型,支持全文索引,支持对text前500个字符的前缀索引
如果是只读表的话,MyISAM表支持数据压缩,可以使用myisampack(linux中的命令)进行压缩
myisampack -b -f myisam.myi 压缩之后得到myISam.old的备份文件,这时候表已经被压缩了,此时不能进行写,只能进行读,
MyISAM的使用场景,非事务型应用,不支持事务的,在报表类的应用不涉及财务的应用等等可以使用,因为支持表压缩所以在只读应用也不错,虽然在读取数据的时候会加共享锁但是共享锁之间是不会阻塞的,在只读应用中并发情况也不错,空间类的一些应用,比如gps数据,并利用空间函数对数据进行计算的时候
Innodb存储引擎
Innodb成为mysql的默认存储引擎,innodb是一种事务型的存储引擎支持事务的ACID特性,innodb时如何实现事务的ACID的,innodb使用了两个特殊的日志类型Redo Log和Undo Log ,Redo Log
innodb支持行级锁,可以最大程度的支持并发,行级锁是由存储引擎层实现的,什么锁,用于管理资源的并发访问,锁用于实现事务的隔离性,锁的分类:读锁共享锁,写锁独占锁,锁的粒度:锁的最小单位,表级锁是开销小的表操作,并发性低,

除了支持事务之外,在存储数据的时候,innodb使用表空间进行存储,使用什么样的表空间,使用innodb_file_per_table,这个参数为ON,OFF,如果为ON则每一个innodb表创建一个以.idb文扩展名的系统文件,tablename,idb,如果未OFF则会把数据存储到系统的公共空间也就是ibdataX,X表示的是一个数字,在linux下使用ls-lh myinnodb*将会列出所有以myinnodb开头的文件
SHOW VARIABLES LIKE ‘innodb_file_per_table’;
set global innodb_file_per_table=off;

系统的公共表空间dbdataX和idb扩展名结尾的独立的表空间要如何进行选择?它们之间有什么区别
在一个繁忙的工作中,系统表空间的大小可能会不断的增长,一旦磁盘空间不足,就要 删除数据,删除长期不会使用的日志的数据和一些无效数据,在删除表的数据后,系统表空间并不会减小,在这种情况下,如果想通过复制的方式对数据库进行备份,虽然删除了数据,但是由于表空间的大小没有改变,意味着虽然删除了数据,但是浪费了很大的空间,而想要收缩系统表空间的唯一方式就是,将整个数据库中的所有innodb表导出之后,删除innodb相关的表空间文件之后 ,重启mysql,然后进行表重建,之后将表中的数据重新导入系统表空间 ,实际上比较复杂和耗时,无法很容易的收缩系统文件,造成大量的空间浪费,并且会产生大量的磁盘碎片。而独立的idb表空间的话,对一个大表中的数据进行清理之后,可以只对这一个表进行optimmize table命令操作(实际上也会对这个表进行重建,但是不会对整个系统的表进行重建,不用重启mysql服务器,甚至是不影响这个表的正常访问)收缩系统未文件,使用独立表空间合适
从IO进行考虑,系统表空间是由于只有一个文件,如果同时对多个数据进行刷新的时候实际上是顺序进行的,会产生IO瓶颈,而对于独立表空间,每个表都有自己的表空间,如果同时对等多个数据进行刷新,可以同时向多个文件刷新数据
强烈建议使用独立表空间:如何将原来存储在系统表空间dbdataX中的表转移到独立表空间中?
第一步使用mysqldump导出数据库中所有的表数据,如果数据库使用了存储过程,触发器,计划事件等要一起导出,第二步,停止Mysql服务器,修改参数M.conf参数,加入innodb_per_table参数,手动删除原来的系统表空间的相关文件(之前已经备份了),第三步重启myql服务,重建innodb系统表空间,最后重新导入已经备份的数据
Innodb的数据字典信息,frm文件时mysql服务器层产生的文件,

系统表空间中有重要的重要的
innodb数据字典相关信息,frm文件,是mysql服务器层产生的,对于mysql所有的存储引擎中的,

frm文件是一个简单的二进制文件,undo回滚段可以单独进行存储


innodb时是一种事务性的存储引擎,完全支持ACID特性,为了实现ACD,使用了两个特殊的日志类型:Redolog (重做日志)和Undo log(回滚),Redo log 主要是用于实现事务的持久性,其组成一个是内存中重做日志缓冲区innodb,一个是重做日志文件,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
undolog主要是用于帮助没有提交的任务进行回滚和是实现mvcc
在对表中的数据进行修改的时候,不仅会产生RedoLog,也会产生Undo log,Redo log进行顺序写入的,在数据库运行的时候不需要对redo log进行读取操作,而UndoLog 是需要进行是随机的读写的

innodb支持的是行级锁同myisam支持的表级锁是不相同,行级锁的特点是在进行写操作的时候需要锁定的数据更少,innodb支持的行级锁是在存储引擎层中实现的,mysql服务器完全行级锁的实现方式
什么是锁?
锁的作用是管理共享资源的 访问,另外锁用于实现事务的隔离性,对于没有提交的事务锁定的数据是无法被其他数据查看到的
锁的类型:
共享锁(读锁) 独占锁(写锁),只有读和读兼容,独占锁和其他任何锁都是不兼容的,对于innodb来说读锁和独占锁都是行锁,实际上innodb除了读读,读写也是支持的
例如:
启动一个事务:begin
update table名 set c1=‘bbbb’ where id =2 表示对c1列加一个独占锁
对这个事务没有提交
在另一个连接中进行读这行数据,结果发现可以读到,因为使用了innodb是利用了存储在undo log中的版本,(innodb中支持异向共享锁,和异向独占锁,这为了在不同粒度上进行加锁)
锁的粒度:被加锁资源的最小单位,比如在行上加锁,就是行级锁,页级锁,表级锁。一种提供并发的方式是让所得粒度尽可能的小,在给定的资源上,锁定的数据越少,并发程度越高
mysql中两种锁粒度,表级锁:开销小,并发性能低,加锁时候要锁定整张表,表级锁通常是在mysql服务器上实现的。innodb默认实现是行级锁,实际上也可以对整表进行加锁,lock table tablename write;表示对整个表进行加锁,unlock table,就是解锁。
行级锁:可以最大程度的支持并发处理,但是锁的开销也大,行级锁只在存储引擎上进行实现
锁的阻塞和死锁:
什么是阻塞:一个表加上了写锁,又想加读锁,就加不上,当系统中出现了大量阻塞,可能是对频繁访问的表加上了排他锁。
死锁:是两个互相占用对方的资源,死锁可以由系统自动处理

提供了一个独特的监控命令
show engine innodb status

innodb的使用场景:只要不是特殊应用应用都选用Innodb,但是现在的版本也也支持空间函数和全文索引

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值