MySQL的存储引擎
存储引擎的概念:就是一种数据库存储数据的机制,索引的技巧,以及锁定水平。
存储的方式和存储的格式。
存储引擎也属于MySQL当中组件,实际上操作的,执行的就是数据的读写I/O。
MySQL存储引擎的分类:
MySQL5.5版本之后默认开始使用innodb,事务型速记存储引擎,支持ACID,支持行锁定。
MYisam:5.5版本之前默认的存储引擎,插入的速度和查询速度很快,但是不支持事务。
(了解即可)被淘汰
Memory:内存型存储引擎,数据在写时都保存在内存当中,一但重启所有数据全部消失。
(了解即可)被淘汰
csv:逗号分割数据的存储引擎,数据文件 .csv文件保存的,execl.保存的文件就是一个普通的文本文件。不支持索引。
(了解即可)被淘汰
innodb存储引擎:
1、读写阻塞(锁表)和事务的隔离级别。
2、能够高效的缓存数据支持多种类的索引。
3、表的索引的类型默认是BTREE类型
4、支持外键,支持全文索引。
5、对硬件的资源要求比较高。
6、行级锁定,会把行锁住,禁止操作。
模糊查询:like进行查询时,会进行全表扫描,在扫描的过程中会锁定整个表。
查询没有创建索引的列,也会锁定整个表。
使用的是索引列,锁定条件的行,行锁定。
show engines; 查看存储引擎
innodb行锁和索引的关系:
行锁是通过索引来实现的。
如果没有索引,innodb会使用默认的隐藏索引来对记录进行加锁。
加了索引就是锁行;
不加索引就是锁表。
创建一个表以及所有列
alter table student add primary key(id);
设置id这一列为主键
insert into student values(1,'小明',18,'男');
insert into student values(2,'小红',19,'女');
insert into student values(3,'小刚',19,'男');
insert into student values(4,'小绿',17,'女');
insert into student values(5,'小黑',20,'男');
往表里面插入内容
然后在另外一台终端里面开启事务,删除小明这一行
然后我们在另外一台更新这一行,两台终端都对这行进行不同命令的操作
运行更新这一行的命令
这一行就被锁住了,然后我们对其他的行进行修改
发现小红这一行也被锁住了,所以这就是全表锁,名字这列没有设置索引,所以就是一但锁住,就是全表查询,全表锁住。
死锁:事务相互等待对方的资源,最后形成一个环路造成的
发生了死锁,数据会自动选择一个事务作为受害者,回滚该事务以解除死锁。
MySQL会终止其中一个事务,但是不会回滚
for update :排他锁,当一个事务的操作未完成时,其他事务可以读取但是不能写入。(写锁)
如何避免写锁的情况出现:
1、以固定的顺序访问表和行
2、大事务尽量拆分成小的事务
3、为表添加合理的索引