1、什么是存储引擎?
在说明存储引擎之前,首先你需要简单了解MqSQL的整体架构。
从上图可知,存储引擎位于整体架构的最底层。
存储引擎真正负责了MySQL中数据的存储和提取。
可以这样理解:
其实我们平时写的各种SQL语句相当于指令,存储引擎只有接受了指令才会进行相应的各种操作。
2、MySQL存储引擎有什么特点?
(1)可插拔式存储引擎。
这也是MySQL与众不同的一点,插件式的存储引擎可以帮助MySQL在不同的业务场景下可以选择合适的存储引擎。
(2)存储引擎是基于表的。
注意这一点,存储引擎是基于表的,而不是库。
3、主要的存储引擎主要分为哪几类?
InnoDB、MyISAM、Memory
4、上述三种引擎各自的特点?
(1)InnoDB特点?
(a)DML操作遵循CAID模型,并且支持事务
(b)行级锁,提高并发访问性能
(c)支持外键FOREIGN KEY约束,保证数据的完整性和正确性。
(d)目前MySQL的默认的表存储引擎
(e)适合对于数据一致性、完整性、更新、删除操作比较频繁的数据表。
(2)MyISAM特点?
(a)不支持事务,不支持外键
(b)支持表锁,不支持行锁
(c)访问速度快
(e)适合查询和插入操作频繁的数据表
(3)Memory特点?
(a)内存存放,默认哈希索引
(b)用于memory存储的引擎的表数据是存储到内存中的,容易受到硬件问题(比如内存占用负载)或者是断电问题的影响,只能将这些表作为临时表或者缓存进行使用。
(c)虽然访问速度很快,但是太大的表无法缓存在内存中,而且无法保证数据的安全性。
5、什么是行锁?什么是表锁?行锁和表锁的区别和联系?
行级锁首先是通过索引进行加载的,因此行锁实现的前提是必须在有索引的基础上,要是对应的SQL语句没有走索引,则会走全表搜索,那么行锁也不会被触发,进而从行锁升级到表锁。
故行锁不是锁掉某一行记录,而是锁掉索引,这一点尤为重要。
对于行级锁,主要分为以下三类:
(1)记录锁:即对某一条记录加锁
(2)间隙锁:对某个范围加锁(但是不包含范围的临界数据)防止其他事物插入间隙,引发幻读现象。
(3)临键锁:由记录锁和间隙锁组成,既包含记录本身又包含范围,左开有闭区间。
InnoDB实现了两种类型的行锁:
(1)共享锁(S):允许一个事物去读一行,组织其他事务获得相同数据集的排它锁。
简单来说:共享锁之间是兼容的,共享锁与排它锁之间则是互斥的。
(2)排它锁(X):允许获取排它锁的事务更新数据,组织其他事物获得相同数据集的共享锁和排它锁。
简单来说:如果一个事务获取到了某一行数据的排它锁,则其他事务则不能获取到这一行数据的共享锁和排它锁了。
大家具体可以参考这一篇博客:
https://blog.csdn.net/qq_36261130/article/details/125552348
表锁:
顾名思义,就是在每次操作的时候锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。
对于表锁主要分为两类:
(1)表共享读锁:
解释:读锁不会阻止其他客户端的读,但是会阻塞所有的写操作(包括自身的写操作)。
(2)表独占写锁:
解释:写锁则不仅阻塞其他客户端的读,又会阻塞其他客户端的写,不会阻塞自身客户端的读操作和写操作。
意向锁:
主要原因:为了避免在DML执行过程中行锁和表锁的冲突。
大家可以想一下:如果我们事务一堆该表的某一行数据(索引)添加了行锁,那么如果事务二相对这张表添加表锁时,会先检查当前表中是否有对应的行锁,如果没有,则会添加表锁,那么这个检查则是从头到尾的一次检查,这样其实效率大大降低。而这个时候如果有了意向锁就不一样了,事务一在对涉及的行除了加行锁之外,也会对该表加上意向锁,事务二则直接根据意向锁来判定是否可以加表锁,这样就避免了逐行判断的情况了,大大提升了效率!!!