【19】C++岗位求职面试八股文第十九篇(数据库)
系列文章目录
第一篇:语言基础
第二篇:设计模式
第三篇:数据库
第四篇:计算机网络
第五篇:操作系统
第六篇:LInux
第七篇:数据结构
第八篇:智力题
[41]B树小结
B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;
B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;
B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;所有关键字都在叶子结点中出现,
[42]Undo原理:(备份旧数据) 原子性
在操作任何数据之前,首先将数据备份到一个地方(这个存储数据备份的地方称为Undo Log)。然后进行数据的修改。如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。
[43]Redo原理:(保存最新数据) 持久性
和Undo Log相反,Redo Log记录的是新数据的备份。在事务提交前,只要将Redo Log持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是Redo Log已经持久化。系统可以根据Redo Log的内容,将所有数据恢复到最新的状态。
[44]MySQL的并发控制与加锁分析
MVCC的设计目的是什么,怎么使用版本号判断数据的可见性
MVCC是一种多版本并发控制机制。锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC,能降低其系统开销。
人们一般把基于锁的并发控制机制称成为悲观机制,而把MVCC机制称为乐观机制。这是因为锁机制是一种预防性的,读会阻塞写,写也会阻塞读,当锁定粒度较大,时间较长时并发性能就不会太好;而MVCC是一种后验性的,读不阻塞写,写也不阻塞读,等到提交的时候才检验是否有冲突,由于没有锁,所以读写不会相互阻塞,从而大大提升了并发性能。 2、MVCC的一种简单实现是基于CAS(Compare-and-swap)思想的有条件更新(Conditional Update)。
[45]乐观锁实现机制
版本号机制、CAS算法

[46]为什么要⽤⾃增的主键
ID 如果是随机的,可能导致分⻚操作,会造成内节点的更改,也许会导致更多的分⻚操作, 带来⼤ᰁ的 IO,影响性能。如果是⾃增的主键 ID,可以保证增加记录的时候是按照⻚⾯的顺 序往后添加的。
[47]联合索引列(如 where a=,b=,c=)如何确定是 a b c 的顺序
如果某⼀列频繁的需要查找和排序/分组,就应该放在前⾯,可以实现索引的复⽤,降低内存空间浪费。查询频率⼀样,那么索引列值⼩的往前放
[48]表的优化
- 尽ᰁ使⽤TINYINT,SMALLINT,MEDIUM_INT替代INT类型,如果是⾮负则加上 UNSIGNED 2. VARCHAR的⻓度只分配真正需要的空间
- 尽ᰁ使⽤整数或者枚举替代字符串类型
- 时间类型尽ᰁ使⽤TIMESTAMP⽽⾮DATETIME
- 单表不要放太多字段
- 尽ᰁ少使⽤NULL,很难查询优化⽽且占⽤额外索引空间
[49]慢查询
(1)设置指定超时时间,超过这个时间的sql语句被称为慢查询(2)long_query_time:默认10秒
优化方法运⾏语句,找到慢查询的sql (2)查询区分度最⾼的字段 (3)explain:显示mysql如何使⽤索引来处理select语句以及连接表,可以帮助选择更好的索引、写出更优化的查询语句 (4)order by limit形式的sql语句,让排序的表优先查 (5)考虑建⽴索引原则 (6)了解业务使⽤场景
[50]MySQL与MongoDB(数据库,非引擎)的区别

[51]如何创建及保存MySQL的索引?
MySQL支持多种方法在单个或多个列上创建索引:
- 在创建表的时候创建索引

- 在已存在的表上创建索引 在已经存在的表中创建索引,可以使用ALTER TABLE语句或者CREATEINDEX语句。


[52]索引种类

[53]索引优化

[54]主键索引(聚簇索引)和非主键索引(非聚簇索引)
InnoDB 使⽤了 B+ 树索引模型,每⼀个索引在 InnoDB ⾥⾯对应⼀棵 B+ 树


[55]MySQL怎么判断要不要加索引?
当唯一性是某种数据本身的特征时,指定唯一索引。使用唯一索引需能确保定义的列的数据完整性,以提高查询速度。
在频繁进行查询、排序或分组(即进行group by或order by操作)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。
[56]只要创建了索引,就一定会走索引吗?
不一定。比如,在使用组合索引的时候,如果没有遵从“最左前缀”的原则进行搜索,则索引是不起作用的。或者使用索引的查询效率比不适用索引的查询效率低时候举例,假设在id、name、age字段上已经成功建立了一个名为MultiIdx的组合索引。索引行中按id、name、age的顺序存放,索引可以搜索id、(id,name)、(id, name, age)字段组合。如果列不构成索引最左面的前缀,那么MySQL不能使用局部索引,如(age)或者(name,age)组合则不能使用该索引查询。
数据库可以没有主键吗可以没有主键。
不过,无论从程序方面还是数据库优化管理的方面,没有主键的表都是一个失败的表。从数据库设计上说,绝大多数情况下,一个表都应该有主键。如果没有主键,很可能你的数据建模是有问题的。
[57]最左前缀
全索引顺序无论怎样排顺序都会使查询走index索引;范围查询,它之后的字段会停止匹配。
结论:MySQL遵循最左前缀原理,当查询条件匹配联合索引的前面几列时,可以使用联合索引;否则,不会使用联合索引。如果where字句中的列全都包含在索引列中,那么where字句中的字段顺序和索引顺序无关,但如果是部分包括的话就要看是否满足最左前缀匹配原则了
mysql where过滤条件中and连接的两个条件的顺序不必和建立的联合索引的字段顺序一致
[58]如何判断数据库的索引有没有生效?
可以使用EXPLAIN语句查看索引是否正在使用。EXPLAIN语句将为我们输出详细的SQL执行信息,其中:possible_keys行给出了MySQL在搜索数据记录时可选用的各个索引。key行是MySQL实际选用的索引。
[59]如何评估一个索引创建的是否合理?
1避免对经常更新的表进行过多的索引,并且索引中的列要尽可能少。应该经常用于查询的字段创建索引,但要避免添加不必要的字段。
2数据量小的表最好不要使用索引,由于数据较少,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果。
3在条件表达式中经常用到的不同值较多的列上建立索引,在不同值很少的列上不要建立索引。比如在学生表的“性别”字段上只有“男”与“女”两个不同值,因此就无须建立索引,如果建立索引不但不会提高查询效率,反而会严重降低数据更新速度。
4当唯一性是某种数据本身的特征时,指定唯一索引。使用唯一索引需能确保定义的列的数据完整性,以提高查询速度。
5在频繁进行查找、排序或分组(即进行group by或order by操作)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。
[60]索引是越多越好吗?
索引并非越多越好,一个表中如有大量的索引,不仅占用磁盘空间,创建索引和维护索引要耗费时间还会影响INSERT、DELETE、UPDATE等语句的性能,因为在表中的数据更改时,索引也会进行调整和更新。
[续]C++岗位求职面试八股文第二十篇(数据库)
更多关于算法题解、软件开发面经、机器学习算法面经、各企业面试问题记录,关注Fintech砖,持续更新中。https://www.nowcoder.com/users/873777317
企业面试记录专栏https://www.nowcoder.com/creation/manager/columnDetail/0YBWnm
机器学习面经专栏https://www.nowcoder.com/creation/manager/columnDetail/j8nNy0
软件开发面经专栏https://www.nowcoder.com/creation/manager/columnDetail/0aXKaM
更多校园招聘常见面试问题(开发、算法、编程题目)参见CSDN博客:http://t.csdn.cn/V4qbH
欢迎关注、收藏、点赞后进行问题咨询及秋招建议!
#晒一晒我的offer##23届找工作求助阵地##我的求职思考##实习,投递多份简历没人回复怎么办##我的实习求职记录#包含C++、操作系统、数据库、计算机组成、计算机网络、设计模式、操作系统、牛客网服务器项目、综合智力题等
