MySQL索引数据结构
-
二叉树
- 在大部分场景下能大大提高查询效率
- 再不分场景下效率急剧下降, 如, 数字按照大小顺序插入就会退化成一个链表
- 改造思路: 不要让链表的情况出现: 红黑树
-
红黑树
- 是一种会自动平衡的二叉树
- 数据量大的情况下效率会比较低, 而且插入数据的时候会不断平衡这棵树
- 改造思路: 大数据量的情况下, 采用
红黑树
+链表
, 即 B树
-
B树
- 叶子节点具有相同的深度, 叶子节点的指针为空
- 所有索引元素不重复
- 节点中的数据索引从左到右递增排列
- 对范围查找支持不是很好
-
B+树(多叉平衡树)
- B树的变种
- 非叶子节点不存储data, 只存储索引(冗余), 那就可以放更多的索引
- 叶子节点包含所有所有索引字段
- 叶子节点用指针连接, 提高取件访问的性能, 便于范围查找
- 一个节点16k的大小, 可以存放1170个索引, 当高度为3就可以存储2kw的数据
- MySQL采用的就是这种数据结构
-
联合索引数据结构
MySQL数据文件
- 位置: <mysql-home>/data/<table-name>/<
*.frm
|*.MYD
|*.MYI
|*.ibd
> - 各个文件的作用
- MyISAM存储引擎:
- *.frm: frame, 数据表的构成框架
- *.MYD: MyISAM Data
- *.MYI: MyISAM Idex
- 叶子节点的数据部分存储数据记录的地址
- InnoDB
- *.frm: frame, 数据表的构成框架
- *.ibd: 索引和数据在同一个文件中
- MyISAM存储引擎:
- 聚集索引
- InnoDB索引的实现
- 叶子节点包含了完整的数据记录
- 表数据文件本身就是按照B+树组织的一个索引结构文件
- 问题
- 为什么InnoDB表必须有主键, 而且推荐整形自增主键?
- B+树结构决定
- B+T与BT的另外一个区别在于B+T的每一个叶子节点都有前一个节点指针和后一个节点的指针, 即构成双向链表, (因为MySQL的数据结构中海油一种是HASH, HASH在等值条件查询的时候比B+T快得多, 但是范围查询就慢的一批), 即自增主键可以很好的构建一个双向链表, 便于范围查询
- 为什么非主键索引结构叶子节点存储的是主键值?
- 为什么InnoDB表必须有主键, 而且推荐整形自增主键?
JVM









Java线程内存模型和CPU缓存模型类似,是基于CPU缓存模型建立起来的, Java线程内存模型是标准化的, 屏蔽了底层不同计算机的区别


volatile原理: MESI缓存一致性协议: 多个CPU从主内存读取同一个数据到各自的高速缓存, 当某个CPU修改了缓存里的数据, 该数据会马上同步到主内存, 其他读取了该变量的CPU通过总线嗅探机制可以感知到数据的变化, 从而使自己缓存中的该变量副本失效


多线程
线程排查死锁
jps
jstack <process-id>

网友评论