第一日的学习总结
今日学习更深刻的理解了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;
以上就是今日总结,如有错漏,请指正。
