7 MYSQL 索引
B+树索引

1. InnoDB 的索引模型
实现索引的方式有很多方式,N 叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中了。在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。InnoDB 使用了 B+ 树索引模型,所以数据都是存储在 B+ 树中的。每一个索引在 InnoDB 里面对应一棵 B+ 树。
B+树索引

实现索引的方式有很多方式,N 叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中了。在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。InnoDB 使用了 B+ 树索引模型,所以数据都是存储在 B+ 树中的。每一个索引在 InnoDB 里面对应一棵 B+ 树。
幻读
幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。对于幻读需要在注意:
没有行锁到底会导致什么问题,我们来看下面这个示例:
事务的隔离性和回滚日志
事务的隔离级别包括:
在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。
全局锁 - 表锁 - 行锁
全局锁:
Flush tables with read lockunlock tables,客户端断开时会自动释放锁做全库备份时,对于 Innodb,通过可重复度隔离级别我们就可以获取数据库的一致视图,但是对 于MyISAM 这些不支持事务的存储引擎,只能使用 Flush tables with read lock 让整个库处于只读状态。
我的数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变?
一个 InnoDB 表包含两部分,即:表结构定义和数据。在 MySQL 8.0 版本以前,表结构是存在以.frm 为后缀的文件里。而 MySQL 8.0 版本,则已经允许把表结构定义放在系统数据表中了。
redo log,bin log 的写入流程
前面我们介绍了 WAL 机制,得到的结论是:只要 redo log 和 binlog 保证持久化到磁盘,就能确保 MySQL 异常重启后,数据可以恢复。今天,我们就再一起看看 MySQL 写入 binlog 和 redo log 的流程,看看 MySQL 是如何保证数据不丢失的。