第一日的学习总结

今日学习更深刻的理解了MySQL数据库中的存储引擎以及索引,下面进行简单的梳理

一、MySQL有什么存储引擎?

InnoDB、MyISAM最常用,但是MyISAM目前也将渐渐的被InnoDB全面替代。InnoDB比较全面,支持事务、表锁、行级锁;MyISAM,不支持事务,仅支持表锁。

Memory是一个将数据存储在MySQL内存中的存储引擎,查询速度快,但是数据的可靠性极低

NDB如果需要设置MySQL cluster集群的时候可以使用。

Archive数据压缩效率高,适合存不需要修改的数据,如日志、历史操作等。

二、MySQL的索引有什么?

按数据结构来说,可以分为: B+树索引(最常用)、Hash索引(单字段查询快,不支持范围查询)、全文索引(可选择某个大文本设置全文索引,作为搜索引擎用)、空间索引(将GIS数据设置为空间索引)

按存储方式来说,可以分为: 聚簇索引(默认选主键,次选不为空的唯一索引,备选隐藏字段row_id。可存储整行数据,不会回表)、非聚簇索引(可有多个,存的是id+索引,可能回表)

按索引性质来说,可以分为: 主键索引、唯一索引(该索引字段不能重复,但是能为空且能有多个为空)、普通索引(无实际意义,只为了提升速度)、联合索引(比设置多个索引更快,但是空间占有率更高)、全文索引(大文本做搜索引擎)、空间索引(GIS数据)

三、细说一下MySQL的锁

分三个层面去了解MySQL中的

锁的粒度:全局锁、表锁、行锁

全局锁:

sql
复制代码
full tables with read lock; unlock tables;

锁住整个库,仅支持当前会话持有锁,其他会话全部阻塞。目前基本不用,使用场景式在MySQL5.7之前,mysqldump如果不加参数,就会执行FTWRL,拿到全局锁保证备份期间数据一致性。

现在仅需要使用InnoDB引擎,备份时开启一次性快照

sql
复制代码
mysqldump --single-transaction

表锁: 分为手动表锁

sql
复制代码
lock tables read/write

MDL元数据锁,InnoDB自动加锁。

DML的时候拿MDL读锁,DDL的时候拿MDL写锁;MDL 锁事务结束才释放;长事务持有 MDL 读锁,会阻塞 alter,后续所有 DML 全部阻塞,线上雪崩。

行锁: 行锁锁的是索引而不是数据行,因此如果没有索引的话,就会退化为表锁;所以,在数据表中,尽量加上索引,不仅是为了提升查询效率, 还为了降低锁的粒度。

锁的排斥性:共享锁、排他锁

共享锁,就是多个事务中,可以同时获取读锁,如果存在了一个读锁了,再来一个写锁就会排斥,需要等待其他事务提交后,写锁才会继续;

排他锁,就是多个事务中,只要有一个事务加锁了,其他事务都不允许再次拿到锁。只允许进行不加锁的读操作,不加锁的写操作也会被排斥。

锁的思想:乐观锁、悲观锁

乐观锁,就是可以乐观的认为, 永远都只会有一个线程去操作数据,不需要加锁,仅需要去判断版本号即可;

sql
复制代码
update table set title = 124 and version = version + where ... and version = version

悲观锁,就是可以悲观的认为,永远都会存在多个线程去操作同一条数据,一定要加锁,就可以去判断要加共享锁还是排他锁了;

sql
复制代码
## 共享锁 select * from table where id = 1 lock in share mode; ## 或 select * from table where id = 1 for share; ## 排他锁 select * from table where id = 1 for update;

以上就是今日总结,如有错漏,请指正。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP