练习题
Posted You295
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了练习题相关的知识,希望对你有一定的参考价值。
练习题(二)
- 1.比较Innodb和Myisam引擎的区别
- 2.描述MVCC
- 3.事务的四大特性是什么?请分别描述
- 4.mysql的索引的底层树结构,为什么使用此种结构?
- 5.Innodb和MyIsam的B+树实现有什么不同?
- 6.简述聚簇索引和非聚簇索引的区别,Innodb使用哪种索引?
- 7.描述更新一行数据的过程
- 8.描述jdbc开发的基本流程。
- 9.简述数据表设计的三大范式
- 10.将两个有序链表合并为一个有序链表
1.比较Innodb和Myisam引擎的区别
答:1)innodb采取的是聚簇索引,数据和索引是放在一起的;Myisam采取的是非聚簇索引。数据和索引是分开的。
2)innodb支持事务;myisam默认表类型不是事务安全的。
3)Innodb支持行锁(共享锁,排它锁,意向锁),但是在执行不能确定范围的sql语句时,innodb同样会锁全表; myisam支持表级锁(不支持高并发,以读为主)。
4)执行大量的update和insert最好选择innodb;执行大量的select(查询)最好选择myisam。
5)Innodb磁盘上存储的是表空间数据文件和日志文件,表的大小只限制与操作系统的大小;myisam磁盘储存有三个文件,frm(存储表定义),myd(存储表数据),myi(存储表索引)。
6)Innodb不保存表的具体行数;myisam会保存
7)innodb支持外键;myisam不支持外键。
2.描述MVCC
答:mvcc是通过进行版本号的对比,防止过量加锁。它会先保存数据的历史版本,通过比较版本号确定数据是否可以显示出来,这样以来读取数据的时候不用加锁就可以保证事务的隔离效果。
流程:首先获取自己的事务id–获取Read view–查询得到的数据,然后通过获取到的版本号进行比较–看是否符合,如果不符合就需要undo log中的历史快照–最后返回符合规则的数据。
3.事务的四大特性是什么?请分别描述
答:1)原子性:保证数据库是一致的,事务中包含的所有的操作,要么都做,要么都不做。
2)一致性:数据库的事务在操作前和操作后都必须满足规则约束。
3)隔离性:多个用户访问数据库时,数据库为每个用户开启的事务不能相互干扰。
4)持久性:事务一旦被提交,那么它对数据库中的数据改变就是永久的,以后无论什么操作就算是发生故障也不能对其产生影响。
4.mysql的索引的底层树结构,为什么使用此种结构?
mysql的索引的底层树结构是B+树。
比较:
1)二叉查找树:不平衡。解决了排序的基本问题,但是由于无法保证平衡,可能退化为链表。
2)平衡二叉树(AVL):旋转耗时。通过旋转解决了平衡的问题,但是旋转的操作效率太低。
3)红黑树:树太高。通过舍弃严格的平衡和引入红黑树节点,解决了AVL旋转效率过低的问题,但是在磁盘等场景下,树仍然太高,IO次数太多。
4)B树:通过将二叉树改为多路平衡查找树,解决了树过高的问题。
5)B+树:在B树的基础上,将非叶节点改造为不储存数据的纯索引节点,进一步降低了树的高度;此外将叶节点使用指针连接成链表,范围查询更加的高效。
6)B+树和B树相比较:
1> 更少的IO次数:B+树的非叶节点只包含键,而不包含真实数据,因此每个节点储存的记录个数比B树多很多,因此B+树更低,访问时所需要的IO次数更少;此外,由于每个节点储存的记录数更多,所以对访问局部性原理的利用更好,缓存的命中率更高。
2>更适用于范围查询:在B树中进行范围查询时,首先要找到查找的下限,然后对B数进行中序遍历,直到找到查找的上限;而B+树的范围查询,只需要对链表进行遍历即可。
3>更稳定的查询效率:B树的查询时间复杂度在1到树的高度之间(分别对应记录在根节点和叶节点),而B+树的查询复杂度则稳定为树高,因为所有的数据都在叶节点。
5.Innodb和MyIsam的B+树实现有什么不同?
答:1)主索引的区别:innodb的数据文件本身就是索引文件。而myisam的索引和数据是分开的。
2)辅助索引的区别:innodb的辅助索引data域存储的是相应的主键值而不是地址,myisam叶节点的data域存放的是数据记录的地址。
6.简述聚簇索引和非聚簇索引的区别,Innodb使用哪种索引?
1)聚簇索引的访问速度比非聚簇索引访问速度快。非聚簇索引需要先查询一遍索引文件,得到索引,再通过索引获取到数据而聚…的索引树的叶子结点直接指向要查找的数据;
2)聚簇索引:树的叶节点data域保存了完整的数据记录。
3)非聚簇索引:将数据和索引分开储存,索引结构的叶子结点data指向数据对应的位置,然后以data域的值为地址,读取相应的数据记录。
Innodb使用的是 聚簇索引。
7.描述更新一行数据的过程
答:先用排它锁将他锁定,然后记录redo,再将修改前的值复制到undo.log中去,修改当前行的值,填写事务编号,最后使用回滚指针指向undo.log中修改前的行。
8.描述jdbc开发的基本流程。
答:加载驱动—连接数据库—创建statment对象—执行sql语句—关闭数据库
9.简述数据表设计的三大范式
答:第一:要求数据具有原子性,使得数据不可再分。
第二:主键策略:选取一个能区分每个实体的属性或者属性组。
第三:非主依赖:在第二大范式的基础上任何非主属性不依赖于其他的非主属性,使得每个字段都独立的依赖于主键字段。
10.将两个有序链表合并为一个有序链表
public ListNode heBing(ListNode l1,ListNode l2)
if(l1==null) //如若l1为空时,直接返回l2
return l2;
if(l2==null) //如若l2为空时,直接返回l1
return l1;
ListNode head = new ListNode(0); //创建新的链表
ListNode tmp = head; //指针,指向头结点
while(l1!=null && l2!=null) //终止条件,两个链表都为空时终止
if(l1.val<=l2.val) //当l1的值小于等于l2的值时将l1中的数据连接在新链表后面
tmp.next = l1;
l1 = l1.next;
else
tmp.next = l2; //否则将l2中的元素连接到新链表后面
l2 = l2.next;
tmp = tmp.next; //更新指针
if(l1==null && l2!=null) //若l1中为空l2中还不为空时,直接将l2中的数据全部连接到新链表后
tmp.next = l2;
l2 = l2.next;
if(l1!=null && l2==null) //若L2中为空L1中还不为空时,直接将l1中的数据全部连接到新链表后
tmp.next = l1;
l1 = l1.next;
return head.next; //返回新链表
以上是关于练习题的主要内容,如果未能解决你的问题,请参考以下文章