🚀 Database
1、数据库基础
1.1 事务的概念和特性
1.2 锁
1.3 锁协议
1.4 事务日志
1.5 MVCC实现原理
1.6 基础知识
1.6.1 三范式
1.6.2 多表连接方式
1.6.3 存储过程
1.6.4 TRUNCATE和DROP的区别
1.6.5 触发器
1.6.6 视图
2、MySQL
2.1 索引
2.2 索引组织表
2.3 InnoDB和MyISAM的区别
2.4 Checkpoint技术
2.5 宕机恢复原理
2.6 数据库优化
2.7 分库分表
2.8 一致性哈希算法
2.9 主从复制
3、Redis
3.1 概述
3.1.1 为什么Redis单线程还这么快
3.1.2 Redis数据类型
3.1.3 持久化机制
3.1.4 过期机制和内存淘汰策略
3.2 线程模型
3.3 分布式问题
3.3.1 Redis实现分布式锁
3.4 缓存异常
3.4.1 缓存击穿、缓存雪崩
3.5 高可用
3.5.1 主从复制
3.5.2 哨兵模式
3.5.3 集群模式
-
+
tourist
register
Sign in
索引组织表
1. 在 InnoDB 存储引擎中,**表都是按照主键顺序组织存放的**,这种存储方式的表称为**索引组织表**(Index Organzied Table)。 2. 在 InnoDB 存储引擎中,**每张表都有个主键**(Primary Key),如果在创建表时没有显式地定义主键,则 InnoDB 存储引擎会按如下方式选择或创建主键: 1. 首先判断表中是否有**非空的唯一索引**(Unique NOT NULL),**如果有**,**该列即为主键**,当表中**有多个非空唯一索引**时,InnoDB 存储引擎将**选择建表时第一个定义的非空唯一索引为主键**,这里需要注意的是,主键的选择根据的是定义索引的顺序,而不是建表时列的顺序,例如下面的例子: 1. 建表及插入数据语句为: ```sql create table z( a int not null, b int null, c int not null, d int not null, unique key(b), unique key(d), unique key(c) ) engine=innodb; insert into z select 1,2,3,4; insert into z select 5,6,7,8; insert into z select 9,10,11,12; ``` 2. 上面示例中创建了一张表 `z`,有 `a`、`b`、`c`、`d` 四列,`b`、`c`、`d` 三列都有唯一索引,不同的是 `b` 列允许 NULL 值,由于没有显式地定义主键,因此会选择非空的唯一索引,虽然 `c`、`d` 列都是非空唯一索引,都可以作为主键的候选,但是在定义的过程中,由于 `d` 列首先定义为唯一索引,因此 InnoDB 存储引擎将 `d` 列视为主键。 3. 可以通过下面的 SQL 语句判断表的主键值,其中 `_rowid` 可以显示表的主键,但是只能用于查看单个列作为主键的情况,不能用于多列组成主键的情况。 ![](/media/202106/2021-06-20_162706.png) ## 参考文献 1. [《MySQL 技术内幕(InnoDB 存储引擎)第 2 版》]()
ricear
Dec. 19, 2021, 3:28 p.m.
©
BY-NC-ND(4.0)
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
share
link
type
password
Update password