目录
6.buffer pool,redo log buffer和undo logo,redo logo,bin log概念以及关系?
10.什么是B+树?为什么B+树成为主要对的SQL数据库的索引实现?
6.buffer pool,redo log buffer和undo logo,redo logo,bin log概念以及关系?
buffer pool是MySQL的一个非常重要的组件,因为针对数据库的增删改操作都是在buffer pool中完成的。
undo log记录的是数据操作前的样子。
redo log记录的是数据被操作后的样子(redo log是innodb存储引擎特有)。
bin log记录的是整个操作记录(这个对于主从复制具有非常重要的意义)。
7.从准备更新一条数据到事务的提交的流程描述?
首先执行器根据MySQL的执行计划来查询数据,先是从缓存池中查询数据,如果没有就会去数据库中查询,如果查询到了就将其放到缓存池中。
在数据被缓存到缓存池的同时,会写入undo log日志文件。
更新的动作是在bufferpool中完成的,同时会将更新后的数据添加到redo log buffer中。
完成以后就可以提交事务,在提交的同时会做以下三件事:
将redo log buffer中的数据刷入到redo log文件中,
将本次操作记录写入到bin log文件中,
将bin log文件名字和更新内容在bin log中的位置记录到redo log中,同时在redo log最后添加commit标记。
8.能说下myisam和innodb的区别吗?
myisam引擎是5.1版本之前的默认引擎,支持全文检索、压缩、空间函数等,但是不支持事务和行级锁,所以一般用于有大量查询少量插入的场景来使用,而且myisam不支持外键,并且索引和数据是分开存储的。
innodb是基于B+tree索引建立的,和myisam相反它支持事务、外键,并且通过MVCC来支持高并发,索引和数据存放在一起。
9.说下MySQL的索引有哪些吧?
索引在什么层面?
首先,索引是在存储引擎层实现的,而不是在服务层实现的,所以不同存储引擎具有不同的索引类型和实现。
有哪些?
B+tree索引
是大多数MySQL存储引擎的默认索引类型。
哈希索引
哈希索引能以o(1)时间进行查找,但是失去了有序性;
Innodb存储引擎 有一个特殊的功能叫"自适应哈希索引",当某个索引值被使用的非常频繁时,会在B+tree索引之上再创建一个哈希索引,这样就让B+tree索引具有哈希索引的一些优点,比如快速的哈希查找。
全文索引
myisam存储引擎支持全文索引,用于查找文本中的关键词,而不是直接比较是否相等。查找条件使用match against,而不是普通的where。
全文索引一般使用倒排索引实现,它记录着关键词到其所在文档的映射。
Innodb存储索引在MySQL 5.6.4版本也开始支持全文索引。
空间数据索引
myisam存储索引支持空间数据索引,可以用于地理数据存储。空间数据索引会从所有维度来索引数据,可以有效地使用任意维度来进行组合查询。
10.什么是B+树?为什么B+树成为主要对的SQL数据库的索引实现?
什么是B+树?
B+树是基于B tree和叶子节点顺序访问指针进行实现,它具有b tree的平衡性,并且通过顺序访问指针来提高区间查询的性能。在B+树中,一个节点中的key从左到右非递减排列,如果某个指针的左右相邻key分别是keyi和keyi+1,且不为null,则该指针指向节点的所有key大于等于keyi且小于等于keyi+1。
为什么是B+tree?
为了减少磁盘读取次数,决定了树的高度不能高,所以鼻血是先b-tree;
以页为单位读取使得一次I/O就能完全载入一个节点,且相邻的节点也能够被预先载入;所以数据放在叶子节点,本质上是一个page页;
为了支持范围查询以及关联关系,页中数据需要有序,且页的尾部节点指向下个页的头部。
B+树索引可以分为聚簇索引和非聚簇索引?
1.主索引就是聚簇索引(也称为聚集索引,clusteres index);
2.辅助索引(有时也称为非聚簇索引或者二级索引,secondary index,non-cluster index)。
如上图,主键索引的叶子节点保存的是真正的数据。而辅助索引叶子节点的数据区保存的是主键索引关键字的值。
假如要查询name=C的数据,其搜索过程如下:1)现在辅助索引中通过C查询最后找到主键id=9;
2)在主键索引中搜索id=9的数据,最终在主键索引的叶子节点中获取到真正的数据。所以通过辅助索引进行检索,需要检索两次索引。
之所以这样设计,一个原因就是:如果和myisam一样在主键索引和辅助索引的叶子节点中都存放数据行索引指针,一旦数据发生迁移,则需要去重新组织维护所有的索引。