姜老师的技术内幕又看了一部分,把觉得重要的记录如下: 索引:

聚集索引:存储是逻辑顺序的,通过双向链表维护,物理存储可以是不连续的。

非聚集索引:叶子节点并不包含行记录的全部数据,叶子节点除了包含键值外,每个叶子节点中的索引行中还包含了一个书签,该书签就是相应行数据的聚集索引键。

索引的选择性:show index from table_name\G;Cardinality/count(*),应尽可能接近1。

联合索引:联合索引(a,b)当执行select * from tb_name where a= order by b desc;时,b已经排序,不会use filesort。

对于联合索引(a,b)一般不能以b作为查询条件,除非是统计类,比如select count(*) from table_name where b>xxx and b <xxx;

一般情况下,有辅助索引,统计查询会使用辅助索引,而不会去使用聚集索引。如下图:

primary存储整行信息,而index只存储作用的列。

访问量小于全表的20%会选择辅助索引,大于20%会选择聚集索引。

锁:

latch和lock都可以称为锁latch分为rwlock和mutex,latch作用于线程,lock的对象时事务。

S锁:允许事务读取一行数据

X锁:允许事务删除或更新一行数据

意向锁:将锁定的对象分为多个层次,对于页上记录上X锁,分别需要对库、表、页上意向锁IX,最后对记录上X锁。

innodb意向锁是表级别的锁。

IS锁,事务想要获得一张表某几行的S锁。

IX锁,事务想要获得一张表某几行的X锁。

意向锁不会阻塞除全表扫描以外的任何请求。

锁的兼容性如下:

a、IS和IX互相兼容

b、IS还与S兼容

c、IX与S、X都不兼容

locks rec but not gap代表锁住的是一个索引,而不是范围。

一致性非锁定读:

通过多版本控制读取快照数据,快照数据是指该行之前版本的数据,是通过undo段来完成的,读取快照数据是不需要上锁的,因为没有事务需要对历史的数据进行修改操作。

RC总是最新版本的快照,RR是事务开始时的快照。

一致性锁定读,显示添加(两种):

for update;对读取的行记录加一个X锁。

lock in share mode;对读取的行记录加一个S锁。

行锁的三种算法:(作用在索引上)

record lock :单个行记录上的锁。

gap lock :间隙锁,锁定一个范围,不包含记录本身。

next-key lock :锁定一个范围,并锁定记录本身。

对于唯一索引,next-key降级record,只锁定记录本身,不锁定范围。

辅助索引分别加锁:

record会锁住索引本身,辅助索引是(x,当前值)区间,innodb还会对辅助索引的下一个值加gap lock (当前值,y),也就是辅助索引会锁住这个范围(x,当前值,y)。

但是RC隔离级别会取消gap lock,只使用record lock锁定,注意这里是辅助索引锁定record,还有主键索引也会锁定record同一行上的主键值。

如果唯一索引由多列构成,查询仅查找其中一列,那么还是会使用next-key lock锁定。