mysql的几点理解

一、主从复制

1)主服务器上面的任何修改都会通过自己的 I/O tread(I/O 线程)保存在二进制日志 Binlog里面。

2)从服务器上面也启动一个 I/O thread,连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log(中继日志)里面

3)从服务器上面同时开启一个 SQL thread 定时检查 Realy log,如果发现有更新立即把更新的内容在本机的数据库上面执行一遍。

二、Inndb索引原理?

B+Tree 作为索引结构,所有记录都按照顺序存放在叶子节点中,各个叶子节点直接通过链表相连,而非叶子节点上只存储key值信息。

 InnoDB 表数据文件本身就是主索引,表数据文件本身就是按 B+Tree 组织的一个索引结构,这棵树的叶点data 域保存了完整的数据记录,这个索引的 key 是数据表的主键

InnoDB 数据文件本身是一棵B+Tree,使用自增主键,记录就会顺序添加到当前索引节点的后续位置。而非单调的主键会造成在插入新记录时数据文件为了维持 B+Tree 的特性而频繁的分裂调整,造成数据表性能降低。这也是分表不建议使用uuid做主键的原因,分表可以选择snowflake算法生成主键。

三、B树、B+树的区别?为什么选择B+树

B-Tree每个节点中不仅包含数据的key值还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。

B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构。所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,所有叶子节点之间都有一个链指针。这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。IO读取次数少(每次都是页读取),范围查找更快捷(相邻页之间有指针)。

四、聚集索引和辅助索引?

1)聚集索引

InnoDB的聚簇索引实际上是在同一个B+Tree结构中同时存储了索引和整行数据,通过该索引查询可以直接获取查询数据行。

聚簇索引不是一种单独的索引类型,而是一种数据的存储方式,聚簇索引的顺序,就是数据在硬盘上的物理顺序。

当你定义一个主键时,innodb存储引擎就把他当做聚集索引。如果你没有定义一个主键,则innodb定位到第一个唯一索引,且改索引的所有列值均为非空,就将其当做聚集索引。如果表没有主键或者合适的唯一索引,innodb会产生一个隐藏的行ID值6字节的ID聚集索引。

2)辅助索引

辅助索引又称非聚集索引,其叶子节点不包含行记录的全部数据,而是包含一个书签(bookmark),该书签指向对应行数据的聚集索引,告诉InnoDB存储引擎去哪里查找具体的行数据。辅助索引与聚集索引的关系就是结构相似、独立存在,但辅助索引查找非索引数据需要依赖于聚集索引来查找。

五、联合索引原理是什么?什么是最左原则?

索引的底层是一颗B+树,联合索引也是一颗B+树。只不过联合索引的健值数量不是一个,而是多个。构建一颗B+树只能根据一个值来构建,因此数据库依据联合索引最左的字段来构建B+树。对复合索引的最左边的,也就是第一个字段的数据进行排序,在第一个字段的排序基础上,然后再对后面第二个字段进行排序。

六、为什么数据库使用B+而不使用红黑树呢?

1)计算器在IO磁盘读取的时候,为了降低读取的次数,默认一次会读取一个页的数据量。MySQL(默认使用InnoDB引擎),将记录按照页的方式进行管理,每页大小默认为16K。linux 默认页大小为4K,所以每次IO读取,都是读取一个页的数据量,所以B树的节点都是存储一个页的节点,这样的查询效率才是最高的。

2)每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个结点只需一次I/O,大大降低了树的高度。

七、为什么Mysql不选择Hash索引?

1)Hash索引精确查找的话,速度会更快,但是却不适合范围查找,而B+树特别适合范围查找

2)Hash索引每次查询要加载所有的索引数据到内存当中,而B+树只需要根据匹配规则选择对应的叶子数据加载即可

八、B+树插入和删除的逻辑

插入

新数据插入到一个满了的节点中时,会优先进行左旋右旋,如果邻近的节点都满了的话,会取中间的一个key往上一个层级插入,直至到Root节点,树的高度的增加,都是通过根节点的拆分来完成的,这保证了所有左右节点的高度差不超过1。

删除

会进行调整优化树形结构,使树的数据更分散,以及降低树的高度。比如如果该节点的数据过少,可以从邻近的节点左旋 右旋数据来填充。可能的话,降低一个树的高度。

九、Innodb事务隔离级别

1)Read Uncommitted 它允许读取其它事务改变但未提交的脏数据,同样会导致不可重复读和幻读问题

2)Read Committed 可避免读取脏数据,依然会导致不可重复读和幻读问题

3)REPEATABLE-READ Mysql默认隔离级别,会导致幻读。但mysql此级别采用MVCC一致性读,也不会产生幻读。

4)Serializable 最高隔离级别,会避免出现上面所有的问题

发布了43 篇原创文章 · 获赞 0 · 访问量 3892

猜你喜欢

转载自blog.csdn.net/zhangdx001/article/details/105306378