zync-mzy / blog

repository as blog, issue as article
7 stars 1 forks source link

MySQL知识点杂记 #32

Closed zync-mzy closed 1 year ago

zync-mzy commented 1 year ago

主要是基于innodb引擎

存储

索引跟行记录都是拆分保存在多个16KB大小的磁盘文件中的

查找的时候先把第一层索引页读入内存,根据索引值确定下一个节点的页ID,然后读取下一个索引页,直至最终读到数据页,遍历数据页的内容找到所需的数据

此外还用buffer pool做了内存缓存,提高读写性能,还会利用局部性原理预读页到内存中提高效率,并依赖redo log来解决没有及时刷脏带来的不一致问题

索引

使用B+树做索引,跟B树的区别是

只有主键索引的叶子节点会保存数据页,二级索引的叶子节点保存的是主键,必要情况下需要再查询主键索引来拿到所需数据,称为回表

联合索引的顺序很重要,因为联合索引的B+树是从前往后一个个字段对比来排序的,因此只有第一个字段是全局有序的,后面的字段是在前面字段已经确定的基础上的局部有序,因此存在最左匹配原则,如果查询条件中不包含前面的字段,则无法用到联合索引

索引查询在遇到范围查询条件时会中止,后面的查询会退化成顺序查找

覆盖索引是指查找的字段刚好是二级索引的一部分,此时无需回表

count(name)的含义是表中name不为null的记录有多少行,如果name是索引,那么要扫索引表,读取每个name的值判断后返回;如果name不是索引,那么要扫全表;如果是count(1)或者count(),那么会扫索引表,但是无需读取name的值;因此,从执行效率上讲,count() = count(常量) > count(索引字段) > count(普通字段);可以通过explain返回的rows字段来获取近似值

事务

ACID实现原理

并发事务带来的问题

不可重复读和幻读都是由于另一个事务提交了导致的

事务隔离级别

查询过程

依次经过连接器、缓存、词法分析、语法分析、预处理、优化器、执行器等

主从同步

从库起两个线程,一个把主库的bin log复制到本地保存到relay log中,另一个把relay log重放 有三种同步策略,异步、半同步、同步,一致性和可用性之间的取舍