打卡第二天.深入理解Mysql索引底层数据结构与算法

57 阅读3分钟

深入理解Mysql索引底层数据结构与算法

总结

Mysql有两种索引 = 聚集索引 + 二级索引

聚集索引是主键组织的B+树,Mysql在B树的基础上,添加了指向相邻数据页的指针,并且把数据都存入叶子节点.

二级索引是指定列组织的B树,叶子节点存储的是主键列

官网要求:主键列要求非空,唯一,很少改变.最好自增.

我们现在还只是在讨论 .ibd文件的落地问题

innodb-architecture-8-0.png

【每日一问】

今天问题:什么是脏读?幻读?不可重复读?

答: 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。 幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

并发事务访问相同记录的情况大致可以划分为3种:读-读,写-写,读-写:这种情况下可能发生 脏读 、 不可重复读 、 幻读 的问题。

官方文档信息

事务隔离是数据库处理的基础之一

对应ACID中的I

  • READ UNCOMMITTED
    • SELECT语句以非锁定方式执行,此类读取不一致。这也称为 脏读。
  • READ COMMITTED
    • 每个一致读取,即使在同一事务中,也会设置并读取其自己的最新快照。
    • 由于间隙锁定被禁用,因此可能会出现幻像行问题,因为其他会话可以将新行插入间隙中。
  • REPEATABLE READ
    • 这是 的默认隔离级别 。 同一事务内的 一致读取会读取第一次读取建立的快照。这意味着,如果您SELECT 在同一事务中发出多个普通(非锁定)语句,这些 SELECT语句彼此之间也是一致的。
  • SERIALIZABLE
    • 此级别类似于REPEATABLE READ,但InnoDB将所有普通SELECT 语句隐式转换为SELECT ... FOR SHARE

官方文档解读

dev.mysql.com/doc/refman/…

聚集索引和二级索引

官方文档上只有 Clustered Index 和 Secondary Index

  • 每个InnoDB表都有一个特殊的索引,称为聚集索引,用于存储行数据。
  • 二级索引与聚集索引的关系
    • 聚集索引以外的索引称为二级索引。
    • 二级索引中的每条记录都包含该行的主键列以及索引指定的列。
      • 所以主键的大小关系到二级索引存储
    • 使用二级索引时,会使用主键查找行数据,俗称"回表"

表的行格式决定了其行在磁盘上的物理存储方式

REDUNDANTCOMPACTDYNAMICCOMPRESSED。行DYNAMIC格式是默认格式。

# 查看默认存储引擎
SELECT @@default_storage_engine;
# 查看innodb存储引擎的行格式
select @@innodb_default_row_format;

可变长度列是列值存储在 B 树索引节点中的规则的一个例外。太长而无法放入 B 树页面的可变长度列存储在单独分配的磁盘页面(称为溢出页面)上。此类列称为页外列。