拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Java岗大厂面试百日冲刺【Day52】— 数据库8 (榷训月累,每日三题)

Java岗大厂面试百日冲刺【Day52】— 数据库8 (榷训月累,每日三题)

白鹭 - 2022-02-12 2087 0 0

??InnoDB的AUTOCOMMIT默认是打开的,即每条SQL陈述句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL陈述句显示放在begin和commit之间,组成一个事务去提交,

2、使用的锁粒度默认为行级锁,可以支持更高的并发;当然,也支持表锁,但不支持页锁,

??其实有这两点就足以奠定InnoDB在存盘引擎中的霸主地位了,你知道的,使用场景真的太多了,

3、支持外键约束;外键约束其实降低了表的查询速度,但是增加了表之间的耦合度,个人感觉很鸡肋的功能,在我们开发中是不允许用外键的,表之间的关联在业务层进行控制即可,否则投产后很可能会对功能和性能造成影响,

4、InnoDB的主键范围更大,最大是MyISAM的2倍,同时,可以通过自动增长列,方法是auto_increment

5、配合一些热备工具可以支持在线热备份;

6、在InnoDB中存在着缓冲管理,通过缓冲池(innodb_buffer_size),可以将部分索引和资料快取起来,加快查询的速度;

在这里插入图片描述

7、对于InnoDB型别的表,其资料的物理组织形式是聚簇表,所有的资料按照主键来组织,资料和索引放在一块,都位于B+树的叶子节点上

8、DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的洗掉,其实在MySQL后台就是给这行资料的is_delete栏位加了标识,实际不会直接清空磁盘内容,当然这也是InnoDB能通过flashback等插件快速找回误删资料的特性(后门儿)之一,

??不爽的是,当你洗掉一张大表后会发现磁盘空间不降反增,别惊讶,磁盘增加的那部分其实是只事务日志信息,想详细了解的同学可以参考我的另一篇文章《delete、truncate、drop的区别有哪些,该如何选择》

每张MyISAM表在磁盘上会对应三个档案,

  1. .frm档案:存盘表的定义资料
  2. .MYD档案:存放表具体记录的资料
  3. .MYI档案:存盘索引

在这里插入图片描述

3、从以往经验来说,select count(*)order by大概是使用最频繁的,大概能占了整个sql总陈述句的60%以上的操作,而这种操作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对它主键是有效,非主键的还是会锁全表的,

当然,我也可以给where、group by、order by的栏位都加索引对吧,不用想了,就是都会加,

4、常常应用部门需要我给他们定期某些表的资料,MyISAM的话很方便,只要发给他们对应那表的(frm.MYD,MYI)的档案,让他们自己在对应版本的数据库启动就行,而Innodb就需要汇出.sql了,因为光给别人档案,受字典资料档案的影响,对方是无法使用的,

5、没有where的count(*)使用MyISAM要比InnoDB快得多,的select count() 是非常快的;MyISAM内置了一个计数器,把表的总行数(row)存盘在磁盘上,当执行 select count() from t 时,直接回传总资料,当时,当 count(*) 陈述句包含 where条件时,两种引擎的操作流程是一样的

6、DELETE FROM table时,MyISAM会先将表结构备份到一张虚拟表中,然后执行drop,最后根据备份重建该表,这是我使用这两个引擎时让我感觉区分最明显的特性之一,

追问:平时开发中你是怎么选择这两个引擎的?

  1. 是否要支持事务;
  2. 读多写少可以倾向 MyISAM,如果写比较频繁就用InnoDB,
  3. 系统奔溃后,MyISAM恢复起来更困难,我之前出现过表损坏情况,能否接受,不能接受选 InnoDB;
  4. 不知道用什么就用InnoDB,

在这里插入图片描述

课间休息,来记录一下小梅同学出差西安前一天,坐标:济南

作者:帅玉阳


面试题2:用过视图幺?为什么要使用视图?

??视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行资料,但是,视图并不在数据库中以存盘的资料值集形式存在,行和列资料来自由定义视图的查询所参考的表,并且在参考视图时动态生成,

在这里插入图片描述

??视图是存盘在数据库中的查询的SQL陈述句,视图有两个特点:

  1. 安全,方便控制权限,我们知道视图是可以隐藏一些资料的,如:个税表,可以用视图查询只显示姓名,地址,而不显示个税号和工资数等,
  2. 可使复杂的查询易于理解和使用,这个视图就像一个视窗,从中只能看到你想看的资料列,或许你查询一个视图时感觉很简单,其实这个视图资料是通过复杂的得来的,真是纸上得来终觉浅,

Decimal(n,m)表示数值中共有n位数,其中整数n-m位,小数m位,例:decimal(10,6),数值中共有10位数,其中整数占4位,小数占6位,

例:decimal(2,1),此时,插入资料18.818等会出现资料溢位错误的例外;插入1.231.2345…会自动四舍五入成1.2;插入2会自动补成2.0,以确保2位的有效长度,其中包含1位小数,

一般用decimal(18,2),长度18,保存2位小数,

??不使用float或者double的原因,是因为float和double是以二进制存盘的,所以有一定的误差,

??比如:在数据库中c1,c2,c3分别存盘型别是float(10,2),decimal(10,2),float型别,

在这里插入图片描述

INTO test (c1,c2,c3) VALUES (1234567.23,1234567.23,1234567.23)

新增后的资料如下图:

在这里插入图片描述

??可以看出,使用float型别存盘有一定的误差,因此使用decimal(x,y)型别,其实每个公司具体情况不同,像我们公司在数据库记录金额时使用的是扩大10000倍的整数来存,如存1.5元时,库中存的就是15000,不用小数来存,在业务代码层控制转换,个人感觉挺香的,

每日小结

??今天我们复习了面试中常问的数据库相关问题,今天的内容你做到心中有数了幺?对了,如果你的朋友也在准备面试,请将这个系列扔给他,如果他认真对待,肯定会感谢你的!!好了,今天就到这里,学废了的同学,记得在评论区留言:打卡,,给同学们以激励,

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *