细谈数据库储存引擎MyISAM与InnoDB
为什么要知道储存引擎MyISAM与InnoDB
又是我,我又去充了三毛钱电费!
追根溯源
作为一个励志成为后端程序员的男人(我是要成为海贼王的男人),怎么可能不会数据库呢,毕竟以后还要经常的CURD呢不是,但我们是有理想有抱负的青年,怎么能只接触表面呢,我们不仅要明白他怎么CURD,更要明白他们的储存原理,只有这样我们才能在以后的工作中面对不同的需求。
先说说MySQL数据库的逻辑结构
我们学java基本上就只是去使用数据,但我们很少去了解数据库的逻辑结构,很少去了解整个数据库是如何实现CURD的过程的,所以今天你们就赚到了。
图片很清晰的解释了各个部分,我就调最重要的几个地方说一下
查询缓存:查询缓存是当数据库接收到一个查询请求,也就是select,会先查看缓存中是否有这条select的记录,有会快速返回结果集,没有就添加,然后将select语句提交给分析器,缓存中会以key-value方式储存查询记录,key就是select语句,value就是查询结构,每个表都有自己的缓存,一旦表的数据有更新,缓存就会清空。
分析器:分析器会分析你的sql语句,然后提交给优化器
优化器:会给据提交来的结果选择合适的索引,或者当你sql语句中有join时候决定表的顺序
储存引擎:都确定好就会来到储存引擎中处理数据,不同的储存引擎适合不同的使用场景,
储存引擎也有很多,这次就说俩个最典型的MyISAM与InnoDB。
MyISAM储存引擎
MyISAM是mysql5.1版本之前的默认储存引擎,他有几个特点
1.锁级别为表级锁
MyISAM的表锁有两种方式,一种是读共享锁,另一种是写独占锁(其实是表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)但是我不喜欢这个读法,哈哈哈哈),读共享锁是指当一个请求读取一个表时,也允许其他请求读取这个表;而写独占锁的就是指当一个请求是修改一个表时,阻塞其他请求读取和修改这个表。
2.不支持事务和全文索引
MyISAM储存引擎是不支持事务的高速储存和检索的数据库储存引擎,所以MyISAM适合用于查询频繁的场景。
3.索引为非聚簇索引
这里先解释一下什么叫聚簇索引和非聚簇索引,省的你们出去查了
聚簇索引:索引所采用的树结构的叶子节点储存的数据
非聚簇索引:索引所采用的树结构的叶子节点储存的不是数据,而是数据的地址
MyISAM储存引擎的索引为非聚簇索引,主索引树和辅助树叶子节点储存的都是数据的地址,所以主索引和辅助索引本质上没有什么区别,数据表存在独立的地方。
InnoDB储存引擎
InnoDB储存引擎是mysql在1.5版本后更改的默认版本,既然更改了,就必然有优于MyISAM的方面,一起看看吧
1.锁级别为行级锁
InnoDB储存引擎的锁最高级别为行级锁,并不是说InnoDB就舍弃了表级锁,InnoDB的行级锁是通过给索引项加锁来实现行级锁的,所以当不同过索引时,InnoDB还是启用的表级锁,行级锁的获取锁和释放锁的过程都会占用很多的资源,所以InnoDB不适合查询过于频繁的场所。
2.支持事务和外键,5.6.4版本之后支持全文索引(FullText)
InnoDB储存引擎的设计是为了适应高并发的场景,所以InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务,同时支持外键。
3.索引为聚簇性索引
InnoDB在索引上进行了很大的优化,将数据直接放在了主索引叶子上,这样主索引便可以直接找到对应的数据,当调用辅助索引的时候会产生回表操作,辅助索引树的叶子节点储存的是主键,所以会再次会到主索引上再次查找,最终获取到数据。
总结小结
MyISAM储存引擎
1.表级锁
2.不支持事务和全文索引
3.索引为非聚簇性索引
适合查询比较频繁的场景,插入,更改比较少,无需事务的场景
InnoDB储存引擎
1.同时使用表级锁和行级锁
2.支持事务和外键
3.索引为聚簇索引,会有回表操作
适合并发性较高,更改表比较频繁的,安全要求较高的场景
最后给你们推荐一本书吧
如果有错误或者需要补充请写在下面,跟我打一架!
古德拜~