[ java-004 ] Mysql底层原理

123 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情

本章节是mysql相关的一些底层原理相关知识点总结,面试必知必会

B+树

B树,排序,一个节点容纳多个元素

B+树,只有叶子节点存储,存储更多数据,有指针

依次递增,二分查找,放不下进行分裂

支持范围查找(哈希不支持)

执行计划 (type=all/ref/index 全表扫描/索引/覆盖索引,key_len=5*N,possible_key)

EXPLAIN SELECT

操作系统:页=4kb

mysql:innodb页=16kb

插入过程中,自动按主键排序

按页载入内存:buffer pool (128M,索引页+数据页) ,后台定时任务,事物提交后,去持久化脏页redo log(checkpoint)

redo log

redo log设置更大 重启恢复慢

innodb_flush_log-at_trx_commit

双写缓冲区 -> 一次4KB磁盘原子性支持存储16KB

free链表(空闲页)

lru链表,用得越多越靠前,淘汰用的少的并持久化到磁盘(热数据换血 1/4 + 时间控制)

flush链表(脏页)

redo log 事物对应语句日志

bin log mysql自己主从同步,不属于存储引擎

undo log buffer pool 数据回滚

innodb 二级索引的叶子节点,存储主键

myisam 二级索引的叶子节点,存储地址,不会排序

a字段主键索引,bcd字段联合索引(二级索引)

len=8 回表次数太多 a b c d e

select * b>1 -> select * b>16 > select b b>1 > select b,c,d,a b>1

select b (bcd叶子节点,覆盖索引)

降序索引、覆盖索引、

索引下推(条件索引 index condition、5.6之前索引+遍历+回表+过滤+回表 、5.6+索引+遍历+过滤+回表)

Mysql join buffer 增大

分库分表

innodb

innodb 支持事物

frm:表结构

ibd: 索引+数据

myisam 不支持事物(插入快,适合从库)

frm: 表结构

MYD: 数据 (回表操作)

MYI:索引

聚集(簇)索引:innodb,数据和索引放在一起,速度快

主键索引 = 聚集 ,1.尽量建立主键(自动选用不相同的列或rowid),2.尽量不要用UUID(自增整型,比较大小快,减少分裂,节约磁盘)3.尽量联合索引 4.尽量少表(笛卡尔积)

二级索引 = 非聚集

非聚集索引:myisam,索引和数据分开存储

哈希索引:一维数组+链表

联合索引:最左前缀法则

总结

mysql知识点,基本是每回面试中必定会问到的知识点,因为使用的企业是在太多了,它的使用门槛非常低,但想要真正的理解和深入使用,还是需要花费一番功夫。比如最基本的为什么要选用B+树,其它的数据结构能否支持,这个在我们心里需要有个清晰的认识。对于mysql的对比产品tidb,我们也可关注下,在做技术选型时,也可以对比下二者的优缺点,选择合适的架构