??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表在磁盘上会对应三个档案,
- .frm档案:存盘表的定义资料
- .MYD档案:存放表具体记录的资料
- .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,最后根据备份重建该表,这是我使用这两个引擎时让我感觉区分最明显的特性之一,
追问:平时开发中你是怎么选择这两个引擎的?
- 是否要支持事务;
- 读多写少可以倾向 MyISAM,如果写比较频繁就用InnoDB,
- 系统奔溃后,MyISAM恢复起来更困难,我之前出现过表损坏情况,能否接受,不能接受选 InnoDB;
- 不知道用什么就用InnoDB,
课间休息,来记录一下小梅同学出差西安前一天,坐标:济南,
作者:帅玉阳
面试题2:用过视图幺?为什么要使用视图?
??视图是一个虚拟表
,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行资料,但是,视图并不在数据库中以存盘的资料值集形式存在
,行和列资料来自由定义视图的查询所参考的表,并且在参考视图时动态生成,
??视图是存盘在数据库中的查询的SQL陈述句,视图有两个特点:
- 安全,方便控制权限,我们知道视图是可以隐藏一些资料的,如:个税表,可以用视图查询只显示姓名,地址,而不显示个税号和工资数等,
- 可使复杂的查询易于理解和使用,这个视图就像一个视窗,从中只能看到你想看的资料列,或许你查询一个视图时感觉很简单,其实这个视图资料是通过复杂的得来的,真是纸上得来终觉浅,
Decimal(n,m)表示数值中共有n位数,其中整数n-m位,小数m位,例:decimal(10,6),数值中共有10位数,其中整数占4位,小数占6位,
例:decimal(2,1),此时,插入资料18.8
、18
等会出现资料溢位错误
的例外;插入1.23
或1.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 评论