Innodb中的事务隔离级别和锁的关系

MySQL · 源码分析 · InnoDB Repeatable Read隔离级别之大不同

聚集索引&辅助索引

聚集索引 clustered index 按照每张表的主键构造一棵 B+树,其叶子节点存放表中的行记录全部数据,因此也将聚集索引的叶子节点称为数据页;非叶子节点中只存放键值和指向叶子节点的偏移量。每个叶子节点(数据页)都通过一个双向链表进行连接。由于实际的数据页只能按照一棵 B+树进行排序,因此数据库中每张表只能有一个聚集索引

聚集索引的优势:

一、对于主键的排序查找非常的快(因为其叶子节点是用双向链表链接的)

二、对于主键的范围查找非常的快(因为通过叶子节点的上层中间节点,就可以得到叶结点的范围值)

辅助索引 亦为 B+ 树结构,叶子结点只保存行的键值和指向对应行的指针(一般指向聚集索引。查询辅助索引在叶子节点获取索引键值+主键值后,判断是否满足查询所需列信息,不满足则需用刚获取的主键值,再查询聚集索引,获取该记录的全部信息,所以辅助索引又名为二级索引。此外 innodb 实现了覆盖索引 (Covering index) , 即叶子结点除了保存该行的键值还保存了对应索引列的值,如果不需要额外数据的话则不需要另外对聚集索引中的数据进行 IO

InnoDB 存储引擎

Untitled

查询的算法过程

  1. 通过对整棵 B + 树的 “二分查找”,定位到具体的 Page
  2. 在一个 Page 内 “二分查找”,使用 Page 中的 Slot,定位到 Record
  3. 比较定位到的 Record,确认是否是需要查询的 Record

Untitled

在实际线上生产环境中,MySQL 存储的数据量和索引是很大的,总体积经常可以达到 TB 级别,即使是金融分片式数据库单分片也常常能达到 1-2TB 大小。所以按照目前常见的服务器架构和配置来说,把这些索引和数据全部存在内存中是不现实的,因此索引和数据都以文件形式存储在磁盘上。