事务是访问数据库的一个操作序列,事务的正确执行使得数据库从一种状态转换为另一种状态。事务必须服从ACID原则。原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。
事务的四种隔离级别
- MyISAM InnoDB
①索引类型: 非聚簇索引 聚簇索引
②支持事务: 否 是
③支持表锁: 是 是
④支持行锁: 否 是
⑤支持外键: 否 是
⑥适合操作类型:大量select 大量insert、delete、update
- 表文件
①MyISAM:.frm表结构文件 .MYI表索引文件 .MYD表数据文件
②InnoDB: .frm表结构文件 .ibd表索引和表数据文件
③Memory:数据是保存在内存中,表结构是存在磁盘文件中,所以重启或宕机时,表中数据丢失,
表结构还在。特点:支持HASH索引(等值查询)和B+数索引(范围查找),默认是HASH;
所有字段do欧威固定长度varchar(10) = char(10);使用表级锁。
- 聚簇索引与非局促索引的区别
聚簇索引并不是一种索引类型,而是一种数据存储方式。聚簇索引是将数据存储与索引放到了一块,
找到索引也就找到了数据。非聚簇索引将数据存储与索引分开的结构,索引结构的叶子节点指向了
数据的对应行的物理地址。
mysql索引的五种类型:主键索引、唯一索引、普通索引、全文索引、联合索引。通过添加索引可以提高数据的读取速速,提高项目的并发能力和抗压能力。
①主键索引:主键是一种唯一性索引,但它必须制定为PRIMARY KEY,每个表只能有一个主键
②唯一索引:索引列的所有值都只能出现一次,即必须唯一,值可以为空
③普通索引:基本的索引类型,值可以为空,没有唯一性的限制
④全文索引:全文索引的索引类型为FULLTEXT,全文索引可以在varchar、char、text类型的列上创建
⑤联合索引:多列值组成一个索引,专门用于联合索引
索引按照数据结构来分的话,主要是两种B+树和hash索引
- 回表:在InnoDB表中,通过普通索引找到主键值,再通过聚簇索引定位到具体的记录,这就是回表。(因为在InnoDB表中,索引使用B+树实现,那么普通索引的叶子节点存的是索引和主键值。)
- 覆盖索引:如果一个索引包含(或覆盖)所有需要查询的字段的值,成为"覆盖索引"。即只需扫描索引而无需回表。
- 最左匹配原则:最左匹配原则是指在联合索引中,如果sql语句中用到了联合索引中的最左边的索引,那么这条sql就可以利用这个联合索引去进行匹配。
- 索引下推:在联合索引的查询场景中,针对特定的过滤条件而进行减少回表次数而坐的优化
MVCC就是为了实现读-写冲突不加锁,而这个读指的是快照读,而非当前读,当前读是使用悲观锁实现的。MVCC指的是"维持一个数据的多个版本,使得读写操作没有冲突",MVCC模型在mysql中的具体实现是由3个隐式字段,undo日志,Read View等去完成的。
并发场景下的几种问题:
①读-读:不存在任何问题,不需要并发控制
②读-写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,不可重复读,幻读
③写-写:有线程安全问题,可能会存在更新丢失问题
MVCC的好处:
①在并发场景下,读操作不阻塞写操作,写操作不阻塞读操作,提高了数据库并发读写的性能
②解决了脏读、不可重复读、幻读等事务隔离问题,但不能解决更新丢失问题
MVCC实现原理
MVCC + next-key locks:next-key locks由record locks(索引加锁/行锁)和gap locks(间隙锁,每次锁住的不光是需要使用的数据,还会锁住这些数据附近的数据)的结合,next-key lock会锁定范围和自身行没比如select…where id < 6,锁定的是小于6的行和等于6的行。
next-ksy lock即在事务中select时使用如下方法加锁,这样在另一个事务对范围内的数据进行修改时就会阻塞:
select * from table where id < 6 lock in share mode; – 共享锁
select * from table where id < 6 for update; – 排他锁
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://lebron.blog.csdn.net/article/details/125010006
内容来源于网络,如有侵权,请联系作者删除!