扩展:InnoDb可重复读隔离(RR)级别如何避免幻读的
通过Next-key锁实现,Next-key由行锁和Gap锁组成。
1.行锁
2.Gap锁:间隙锁,锁定周围数据以及包括行记录本身,该锁在低隔离级别下是不存在的,所以其隔离级别避免不了幻读问题。
如果Where后面的条件全部命中,例如in后面的条件全部命中,则不加Gap锁。
如果Where后面的条件部分命中或者全不命中,则会加Gap锁。(部分命中,会部分加Gap锁)
Gap锁一般用在非唯一索引或者不走索引的当前读中
如果是非唯一索引,那么官方给出的范围是左开右闭,10、11、13、20
如果是不走索引,那么锁的范围会大一点
当前读:上锁的增删改查sql语句均成为当前读,即不论是共享锁还是排它锁,因为读取的数据是最新版本的。
快照读:不加锁的非阻塞读select(前提条件是非Serializable隔离级别下)
既没有主键也没有唯一键,innodb默认会创建隐形自增主键
SQL语法补充
1.当用到Group by时,后面的字段必须出现在select后面,或者是其它字段的函数表达式,如果出现group by之外的字段,则会报错(同一张表内,多表不会报错)
2.Having一般用在group by后面,用于对结果的限定;where用在group by前面,用于条件的查询
3.Group by什么时候用,一般当没有给指定条件时,类似相当于所有数据的循环遍历。同时,相同的数据会合并。
本章总结
RDBMS数据库:架构、索引、锁、语法、理论范式
例如索引:1.为什么要使用索引 2.什么样的信息能成为索引 3.索引的数据结构 4.密集索引与稀疏索引的区别
myisam存储引擎,不管是主键索引,唯一键索引还是普通索引都是稀疏索引
innodb存储引擎:有且只有一个密集索引。密集索引的选取规则如下:
若主键被定义,则主键作为密集索引
如果没有主键被定义,该表的第一个唯一非空索引则作为密集索引
若不满足以上条件,innodb内部会生成一个隐藏主键(密集索引)
非主键索引存储相关键位和其对应的主键值,包含两次查找
密集索引的定义:叶子节点保存的不只是键值,还保存了位于同一行记录里的其他列的信息,由于密集索引决定了表的物理排列顺序,一个表只有一个物理排列顺序,所以一个表只能创建一个密集索引
稀疏索引:叶子节点仅保存了键位信息以及该行数据的地址,有的稀疏索引只保存了键位信息机器主键
实质就是密集索引查询数据时可以不用返回到上层节点,可以直接去定位同一行数据。而稀疏索引每次都需返回上层节点并重新开始索引查询。