一、mysql主要索引类型
- 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值。
- 唯一索引:索引列中的值必须是唯一的,但是允许为空值。 主键索引:索引列中的值必须是唯一的,不允许有空值。
- 前缀索引:在文本类型如CHAR,VARCHAR,TEXT类列上创建索引时,可以指定索引列的长度,但是数值类型不能指定。
- 全文索引:只能在文本类型CHAR,VARCHAR,TEXT类型字段上创建全文索引。字段长度比较大时,如果创建普通索引,在进行like模糊查询时效率比较低,这时可以创建全文索引。MyISAM和InnoDB中都可以使用全文索引。
- 空间索引:MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型。MySQL在空间索引这方面遵循OpenGIS几何数据模型规则。
二、单列索引
1、主簇索引查找流程
等值查找
范围查找
2、辅助索引查找流程
三、组合索引
1、组合索引失效场景
组合索引失效场景
2、组合索引底层结构与查找流程
四、mysql innodb的锁
1、从类型上分
- 共享锁(S-Lock):允许事务读一行数据
- 排它锁(X-Lock):允许事务删除或者更新一行数据
2、锁定方式(基于索引)
- Record lock(行锁):在单行上加锁
- Gap Lock:间隙锁,锁定一个范围,但不包含当前记录
- Next-Key Lock:Gap Lock+Record Lock,锁定一个范围,并包含当前记录
四、mvcc与事务隔离级别
1、事务隔离级别
2、基本概念
1)事务id的分配时机
这里要注意在默认情况下,只有执行修改操作(如INSERT、DELETE、UPDATE语句)才会分配一个事务id,SELECT并不会。
如果通过start transaction使用事务时,并不会马上就分配事务id,也要第一次执行修改操作才会分配,如果开启事务后第一条语句时SELECT,系统会产生如下所示的随机id,等到执行了真正的修改操作时,才会分配一个正式的事务id
2)MVCC读操作
3)redo log 链条
4)Read View(读视图)
产生时机:第一条select执行的时间
<up_limit_id:可见
=low_limit_id:不可见
=up_limit_id && <low_limit_id && ∉(trx_list):可见
=up_limit_id && <low_limit_id && ∈(trx_list):不可见
4)解决不可重复读流程分析