姜老师的技术内幕又看了一部分,把觉得重要的记录如下: 索引:
聚集索引:存储是逻辑顺序的,通过双向链表维护,物理存储可以是不连续的。
非聚集索引:叶子节点并不包含行记录的全部数据,叶子节点除了包含键值外,每个叶子节点中的索引行中还包含了一个书签,该书签就是相应行数据的聚集索引键。
索引的选择性: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锁定。