MySQL锁

行锁:锁某行数据,粒度最小,并发度搞

表锁:锁整张表,力度最大,并发度低

间隙锁:锁一个区间

共享锁:其他事务能读不能写

排他锁:其他事务不能读也不能写

乐观锁:通过版本号实现

悲观锁:行锁表锁都是悲观锁

如何优化:

检查是否走索引

检查是否查询了过多的字段,查出过多的数据

数据记录是否过多,分库分表

检查配置是太低

EXPLAIN

索引覆盖:所有需要的字段都在索引里,不用回表

最左匹配原则:是原则也是限制

innodb如何实现事务的?

Buffer Pool, LogBuffer, Redo Log, Undo log

update:缓存到buffer pool=> x修改buffer pool 内的数据=》生成redolog对象,存入logbuffer=》生成undolog日志,用于回滚=》

如果提交事务=》redolog持久化,后续其他机制将buffer log中修改的数据(脏页)持久化到磁盘

如果回滚=》利用undolog回滚

索引原理:把无序的数据变成有序的查询

.把创建索引的内容进行排序

.生成倒序表

.拼接地址链

.拿到倒排表 拿到地址链

聚簇索引和非聚簇索引的区别

都是B+数

聚簇索引:将数据存储和索引放到一块、按照一定顺序组织的

优势:可以直接取到数据

劣势:维护索引代价很高(optimize table)

如果使用uuid做主键会导致数据非常稀疏

如果主键比较大的话,辅助索引将会变大,因为存了ID

非聚簇索引:叶子节点补存储数据、存储的数据行地址(ID?)innodb是存的id

主键一定是聚簇索引,在聚簇索引上建的索引是辅助索引

innodb一定有主键

MyISM无需访问主键索引树

B+树:平衡的多叉树,叶子节点高度差不超过1(0?)、同级节点间指针相互连接,可以快速左右移动

、Hash索引:一张哈希表,不能范围查询,不能模糊查询,不支持最左匹配,只支持单条等值查询

二叉树:2个节点

共享锁:读锁,支持并发读取,读的时候不支持修改

排他锁:写锁,其他请求不能读取和修改,避免出现脏数据和脏读的问题。

表锁:

行锁:可以锁多行

记录锁:锁一行,使用唯一索引,可以避免重复读问题,也避免了在修改的事务未提交前被其他事务读取的脏读问题。

页锁:会出现死锁,一次锁定相邻的一组记录

间歇锁:行锁的一种,锁住表记录的某个区间,左开又闭

临建锁:记录锁和间歇锁的组合

意向共享锁:

意向排他锁:

提高加锁的效率

innodb默认行锁

explain:

type:

const: id=1 索引一次命中,匹配一行记录

system: 表中只有一行记录,相当于系统表

eq_ref: 唯一索引扫描

ref: 非唯一索引扫描,某个值得所有记录

range: 范围内的行

index: 只遍历索引树

All: 全表扫描

避免all和index