关于Mysql数据库,这些知识点你确定都会了吗?( 二 )


读已提交 (READ_COMMINTED)
一个事务A读取一个事务B已提交的数据 , 解决了脏读问题 , 但是在一个事务范围内两个相同的查询却返回了不同的数据 , 那么这就是不可重复读 。
可重复读 (REPETABLE_READ)
事务开启时 , 不再允许其它的事务修改数据 。这样就可以无限制读取没有被修改的数据 , 解决了不可重复读 , 当有并行插入操作时候就会出现幻读 。
可串行化(SERIALIZABLE)
在可串行化的隔离级别下 , 将事务串行化顺序执行 。那么事务不能进行并行操作 , 也就解决了幻读的问题 。
MYSQL InnoDB 引擎默认事务隔离级别是可重复读(REPEATABLE_READ) ORACLE 引擎默认事务隔离级别是可串行化(SERIALIZABLE)
InnoDB 索引innoDB特性

  1. 完全的事务支持
  2. 基于行存储的行级锁
  3. 多版本并发控制
  4. 原子死锁检测
  5. 原子崩溃恢复
innodb 架构图
innodb 逻辑存储结构
在 innodb下 , 所有的数据都存储在一个表空间中 , 表空间又由段(segment)、 区(extent)、 页(page)、行(row)组成 , 页在有些文档中也成为块(block) 1 extent = 64 page
innodb 存储结构图
B-tree定义:B树满足如下条件 , 即可称之为m阶B树:
  1. 每个节点最多可以拥有m棵子树;
  2. 根节点最少拥有2棵子树(存在子树的情况下);
  3. 除了根节点以外 , 其余每个分支节点至少拥有m/2棵子树;
  4. 所有的页节点都在同一层上;
  5. 有k棵子树的分支节点则存在k-1个关键码 , 关键码按照递增次序进行排列;
  6. 关键子树量需要满足ceil(m/2)-1 <= n <= m-1;
b树图
B-tree 的特点是每个节点不仅存放键值 , 而且存放数据 。
b+tree图
B+树特点:1. 所有的叶子节点中包含了全部元素的信息 , 及指向含这些元素记录的指针 , 且叶子节点本身依关键字的大小自小而大顺序链接 。2. 所有的中间节点元素都同时存在于子节点 , 在子节点元素中是最大(或最小)元素 。
B+树的优点:1. 单一节点存储更多的元素(因为不含有对应的值 , 仅仅含有键) , 使得查询的IO次数更少 。2. 所有查询都要从跟节点查找到叶子节点 , 查询性能稳定 , 相对于B树更加稳定 , 因为B+树只有叶子节点存储了对应的值信息 。3. 所有叶子节点形成有序双向链表 , 对于SQL的范围查询以及排序查询都很方便 。4. b/b+树的共同优点:每个节点有更多的孩子 , 插入不需要改变树的高度 , 从而减少重新平衡的次数 , 非常适合做数据库索引这种需要持久化在磁盘 , 同时需要大量查询和插入的应用 。树中节点存储这指向页的信息 , 可以快速定位到磁盘对应的页上面 。
Mysql 锁总结锁不仅是资源占有的一种处理机制 , 更是多线程或并发编程下对数据一致性的一种保证 。加锁和释放锁本身也会消耗资源 。了解并合理利用锁机制 , 能大大提升数据库的性能 。锁的作用者是事务 , 也就是说 , 锁是针对事务使用而言 。单个操作不显示的开启和提交/回滚事务 , 默认情况下每个操作会自动开启一个事务 。
共享锁
一个事务对数据加共享锁 , 也可以允许其它事务对此交集数据加此锁 。但阻止其它事务对此交集数据加排他锁 。
加共享锁语句:SELECT * FRPM TABLE_NAME WHERE LOCK IN SHARE MODE;
排他锁
一个事务对数据加排他锁 , 会阻止其它事务对此交集数据加任和锁 。
加排他锁语句:SELECT * FROM TABLE_NAME WHERE FOR UPDATE;
意向锁
为了允许行锁和表锁共存 , 实现多粒度锁机制 , InoDB还有两种内部使用的意向锁 , 在这里的两种意向锁都是表锁 。
意向共享锁
事务打算给数据行共享锁 , 事务在给一个数据行加共享锁前必须先取得该表的意向共享锁 。
意向排他锁
事务打算给数据行加排他锁 , 事务在给一个数据行加排他锁前必须先取得该表的意向排他锁 。
意向锁是innodb 自动加的 , 不需要用户干预 。
表级锁
每个事务操作会锁住整张表 , 粒子度最大 , 简单粗暴 。优点是加锁和释放锁次数会大大减少 。缺点是锁冲突的概率会大大增加 , 高并发情况下不可取 。


推荐阅读