一起养成写作习惯!这是我参与「掘金日新计划 · 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,我们也可关注下,在做技术选型时,也可以对比下二者的优缺点,选择合适的架构