MySQL-----笔记3:存储引擎
1、存储引擎:
https://zhidao.baidu.com/question/1049565846666168579.html
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。
这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。
2、MySQL的存储引擎:MyISAM和InnoDB(默认)
- 如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择。支持行锁定和外键。维持自己的缓冲池,支持外键完整性约束。
- 如果数据表主要用来插入和查询记录,不支持事物,则MyISAM引擎能提供较高的处理效率。
- 如果只是临时存放数据,数据量不大,不需要较高的安全性,可以选择将数据保存在内存中的Memory引擎中。
(1)InnoDB锁模式:
InnoDB实现了两种类型的行锁。
①共享锁(S):允许一个事务去读一行,阻止其他事务获得相同的数据集的排它锁。
即我读的时候,你也可以读但是不能写。
②排它锁(X):允许获得排他锁的事务更新数据,但是其他事务不可以获得共享锁和排它锁。
即我写的时候,你不能读也不能写。
这两个锁就是就是MyISAM的读锁和写锁,只是针对的对象不同。
InnoDB还有两个表锁:
意向共享锁(IS):表示事务准备给数据行加入共享锁,即一个数据行加共享锁前必须先取得该表的IS。
意向排他锁(IX):表示事务准备给数据行加入排它锁,即一个数据行加排它锁前必须先取得该表的IX。
锁的实现方式:
在MySQL中,行级锁并不是直接锁记录,而是锁索引。如果没有索引,InnoDB会通过隐藏的聚簇索引来对记录加锁,即其对表中所有数据加锁,实际效果和表锁一样。
行锁分为三种情形:
Record lock:对索引加锁,即锁定一条记录。
Gap lock:对索引项之间的间隙加锁,不锁记录。即锁定一个范围的记录。
Next-key Lock:锁定一个范围的记录并包含记录本身(上面两种锁的结合)
死锁产生:互斥条件、请求和保持条件、不剥夺条件、环路等待条件
互斥:一段时间内某资源只能由一个进程使用。
请求保持条件:进程已经保持至少一个资源,但又提出新的资源请求,该资源被其他进程占有,此时请求阻塞,而自己的资源不释放。
不剥夺条件:进程所获得的资源在未使用完之前,不能被剥夺。
环路等待条件:在发生死锁时,必然存在一个进程---资源的环形链,即p0申请p1的资源,p1申请p0的资源。
避免死锁的方法:
①表:按照约定以相同顺序访问表,可以降低死锁机会。
②事务:在同一个事务中,尽可能做到一次锁定所需要的所有资源
③对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率。
3、MySQL体系结构
mysql由连接池组件、管理服务和工具组件、sql接口组建、查询分析器组件、优化器组件、缓存组件、插件是存储引擎、物理文件。