【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]表的优化

  1. 尽ᰁ使⽤TINYINT,SMALLINT,MEDIUM_INT替代INT类型,如果是⾮负则加上 UNSIGNED 2. VARCHAR的⻓度只分配真正需要的空间
  2. 尽ᰁ使⽤整数或者枚举替代字符串类型
  3. 时间类型尽ᰁ使⽤TIMESTAMP⽽⾮DATETIME
  4. 单表不要放太多字段
  5. 尽ᰁ少使⽤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支持多种方法在单个或多个列上创建索引:

  1. 在创建表的时候创建索引
  2. 在已存在的表上创建索引 在已经存在的表中创建索引,可以使用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++、操作系统、数据库、计算机组成、计算机网络、设计模式、操作系统、牛客网服务器项目、综合智力题等

全部评论

相关推荐

点赞 评论 收藏
分享
评论
1
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务