7天八股速记之C++后端——Day 4

坚持7天,短期内快速完成C++后端面试突击。每天10题,弥补后端八股知识缺漏,熟练掌握后端的高频考点,后端面试更有把握。

1. 一条 SQL 语句在数据库框架中的执行流程?

  1. 连接数据库

    • 客户端应用程序通过数据库连接池或者直接建立数据库连接,连接到数据库服务器。
  2. SQL解析

    • 数据库服务器接收到客户端发送的SQL语句后,首先进行SQL解析,包括语法分析、语义分析等,确保SQL语句的正确性和合法性。
  3. 查询优化

    • 解析完成后,数据库服务器将对SQL语句进行查询优化。优化器会根据查询的复杂度、表的大小、索引情况等因素选择最优的执行计划。
  4. 执行查询计划

    • 优化器生成可执行的查询计划后,数据库服务器会按照该计划执行查询操作。这包括从磁盘或者内存中读取数据、执行过滤条件、执行排序、执行聚合等操作。
  5. 返回结果

    • 当数据库服务器执行完查询操作后,将结果返回给客户端应用程序。如果是查询语句,返回的结果是查询的结果集;如果是更新语句,返回的结果可能是受影响的行数或者执行状态等。
  6. 断开连接

    • 客户端应用程序处理完结果后,断开与数据库服务器的连接,释放资源。

2. 数据库的三范式是什么?

  1. 第一范式(1NF)

    • 要求有主键,并且要求每一个字段原子性不可再分。
  2. 第二范式(2NF)

    • 要求所有非主键字段完全依赖主键,不能产生部分依赖。
  3. 第三范式(3NF)

    • 所有非主键字段和主键字段之间不能产生传递依赖。

3. char 和 varchar 的区别?

  1. char

    • char 是一种固定长度的字符类型,它用于存储固定长度的字符串。
    • 当定义一个char(n)类型的列时,该列将始终占用固定长度的存储空间,无论实际存储的字符串长度是否达到指定的长度 n
    • 如果存储的字符串长度小于指定的长度 n,则系统会使用空格来填充,保证占用的存储空间达到指定的长度。
  2. varchar

    • varchar 是一种可变长度的字符类型,它用于存储可变长度的字符串。
    • 当定义一个varchar(n)类型的列时,该列占用的存储空间取决于实际存储的字符串长度,而不是固定的。
    • char不同,varchar存储的实际字符串长度不会被填充,而是根据实际需要动态分配存储空间。

主要区别总结如下:

  • char存储固定长度的字符串,varchar存储可变长度的字符串。
  • char占用的存储空间固定,不受实际字符串长度影响,而varchar占用的存储空间取决于实际字符串长度。
  • 在存储大量短字符串或者长度差异较大的情况下,varchar通常比char更节省存储空间。
  • 在执行检索、排序和比较等操作时,由于char的存储长度固定,可能会更快,但在存储空间方面varchar更灵活。

4. varchar(10) 和 varchar(20) 的区别?

varchar(10)varchar(20) 的区别在于能够存储的字符串的最大长度:

  1. varchar(10)

    • varchar(10) 表示该列可以存储最多10个字符的可变长度字符串。
    • 如果插入的字符串长度超过10个字符,数据库会截断超出部分,只存储前10个字符。
    • 如果插入的字符串长度不超过10个字符,则数据库会完整地存储该字符串,不会填充多余的空格。
  2. varchar(20)

    • varchar(20) 表示该列可以存储最多20个字符的可变长度字符串。
    • 如果插入的字符串长度超过20个字符,数据库会截断超出部分,只存储前20个字符。
    • 如果插入的字符串长度不超过20个字符,则数据库会完整地存储该字符串,不会填充多余的空格。

varchar(n) 中的 n 表示该列可以存储的字符串的最大长度,超过最大长度的部分会被截断,而不会抛出错误。不同的 varchar(n) 之间的区别在于允许存储的最大长度不同。

5. 索引的底层使用的是什么数据结构?

索引在关系型数据库中通常使用B树(B-tree)或者B+树(B+ tree)作为底层数据结构。

  1. B树

    • B树是一种多路搜索树,通常用于数据库索引中。它具有以下特点:
      • 每个节点可以包含多个子节点,通常称为分支节点。
      • 每个节点中的关键字都按照顺序排列,并且与其对应的子节点之间有序地分割关键字空间。
      • 所有叶子节点都位于相同的深度,形成一个平衡的树结构。
    • B树的特点使得它适用于在磁盘上存储索引数据,因为它能够最小化磁盘I/O次数。
  2. B+树

    • B+树是在B树基础上进行改进的一种数据结构。与B树相比,B+树具有以下特点:
      • 所有关键字都存储在叶子节点上,非叶子节点只包含关键字的索引信息。
      • 叶子节点之间通过指针连接形成链表,方便范围查询。
      • 非叶子节点的关键字范围覆盖其子节点的关键字范围。
    • B+树的特点使得它在数据库索引中更为常见,因为它具有更好的顺序访问性能和更高的存储效率。

6. 聚簇索引

聚簇索引(Clustered Index)是一种特殊类型的索引,它对数据库表中的数据行进行排序,并且将数据存储在索引的叶子节点中,而不是在独立的数据页中。换句话说,聚簇索引决定了数据在磁盘上的物理存储顺序,因此表中的数据行实际上是按照聚簇索引的顺序排列的。

聚簇索引的特点包括:

  1. 物理排序:数据行按照聚簇索引的顺序存储在磁盘上,这使得范围查询和顺序扫描的性能得到了显著的提升。

  2. 唯一性:由于聚簇索引决定了数据行的物理存储顺序,因此每个表只能有一个聚簇索引。如果表上已经存在了聚簇索引,则该表的主键约束将自动成为聚簇索引。

  3. 覆盖查询:如果查询的列恰好是聚簇索引中的列,那么数据库可以直接从聚簇索引中读取数据,而不需要再额外访问数据行。这种情况下称为覆盖查询,可以减少I/O开销。

  4. 索引维护代价:由于聚簇索引决定了数据的物理存储顺序,因此插入、删除、更新等操作都可能导致数据行的物理重新排序,从而增加了维护索引的代价。

7. 谈谈你对哈希索引的理解?

哈希索引(Hash Index)是一种在关系型数据库中常见的索引类型,它通过哈希函数将索引键值映射到索引表中的存储位置,从而加速对索引列的查找操作。哈希索引的主要特点包括:

  1. 快速查找:哈希索引通过哈希函数直接计算索引键值在索引表中的存储位置,因此可以快速定位到目标数据,实现常数时间复杂度的查询操作。

  2. 适用于等值查询:哈希索引适用于等值查询,即通过索引键值精确匹配目标数据。对于等值查询,哈希索引通常具有较高的查询性能。

  3. 不支持范围查询:由于哈希函数的特性,哈希索引不支持范围查询,无法直接进行大于、小于或区间查询等操作。

  4. 冲突处理:由于哈希函数的映射可能会导致多个不同的键值映射到同一个存储位置,即发生哈希冲突。为了处理冲突,通常使用开放地址法、链地址法等技术。

  5. 数据分布均匀性:哈希索引的性能受到哈希函数的影响,良好的哈希函数可以使数据分布均匀,减少冲突的发生,提高索引的效率。

  6. 适用场景:哈希索引适用于等值查询频繁且数据分布均匀的场景,例如主键、唯一键等。但对于范围查询频繁的情况,哈希索引的性能可能不如B树或B+树索引。

8. 谈谈你对覆盖索引的认识?

覆盖索引(Covering Index)是一种索引优化技术,它通过创建包含查询所需的所有列的索引,从而避免了查询需要额外访问数据行的情况,减少了I/O开销,提高了查询性能。具体而言,覆盖索引具有以下特点:

  1. 减少数据访问:覆盖索引包含了查询所需的所有列,因此当数据库执行查询时,可以直接从索引中获取查询所需的数据,而不需要额外访问数据行。这可以减少磁盘I/O次数和数据缓存的使用,提高了查询性能。

  2. 减少索引扫描:对于覆盖索引来说,数据库可以直接从索引中获取查询结果,而不需要进行全表扫描或者索引扫描。这可以大大减少查询的时间复杂度,特别是对于大型表或者复杂查询的情况。

  3. 适用范围:覆盖索引通常适用于查询中只涉及到索引列和查询列的情况。如果查询中需要获取的列都包含在索引中,那么数据库可以直接使用覆盖索引来满足查询需求,而不需要额外访问数据行。

  4. 提高性能:由于覆盖索引可以减少数据访问和索引扫描,因此可以显著提高查询性能,特别是对于频繁执行的查询或者对性能要求较高的场景。

  5. 索引设计:为了使用覆盖索引,需要合理设计索引,确保索引包含了查询所需的所有列,并且避免创建过多的冗余索引。合理设计和使用覆盖索引可以优化数据库的查询性能和系统的整体性能。

9. 谈谈你对最左前缀原则的理解?

最左前缀原则(Leftmost Prefix Rule)是指在多列索引中,如果查询条件只涉及到了索引的最左边的一部分列,那么数据库可以有效地使用这个多列索引。具体而言,最左前缀原则具有以下几个关键点:

  1. 索引最左边的列:在一个多列索引中,最左边的列指的是索引中排在最前面的那一列。

  2. 最左前缀匹配:如果查询条件只涉及到了多列索引的最左边的一部分列,那么数据库可以利用这个索引,即使索引包含了更多的列。这种匹配方式被称为最左前缀匹配。

  3. 索引的选择:如果查询条件不符合最左前缀原则,即查询涉及到了索引中不是最左边的列,那么数据库可能无法有效地使用这个索引。在这种情况下,数据库可能选择不使用索引,而是进行全表扫描或者其他索引。

  4. 适用范围:最左前缀原则通常适用于联合索引(Composite Index)的情况,即包含多个列的索引。在联合索引中,如果查询条件只涉及到了索引的最左边的列,那么数据库可以使用这个索引来加速查询操作。

10. 怎么知道创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?

要知道创建的索引是否被查询语句使用到,以及找出语句运行缓慢的原因,可以通过以下几种方法进行分析:

  1. 执行计划分析

    • 使用数据库管理系统提供的执行计划工具(如EXPLAIN命令),可以查看查询语句的执行计划。执行计划会显示查询优化器选择的索引、访问方式以及是否使用了索引。如果执行计划中显示使用了索引,说明该索引被查询语句使用到了。
  2. 索引统计信息

    • 查询数据库系统的索引统计信息,查看创建的索引的使用情况。大多数数据库系统都提供了系统视图或者系统表,用于查看索引的使用统计信息,例如MySQL中的SHOW INDEX命令或者information_schema系统表。
  3. 监控工具

    • 使用数据库性能监控工具来监控查询的执行情况和索引的使用情况。这些监控工具通常会提供详细的性能指标和分析报告,帮助识别查询性能问题和索引使用情况。
  4. 慢查询日志

    • 启用数据库系统的慢查询日志功能,记录执行时间超过阈值的查询语句。通过分析慢查询日志,可以找出执行时间较长的查询语句,进而分析其执行计划和索引使用情况。
  5. 数据库性能优化工具

    • 使用专门的数据库性能优化工具进行性能分析和调优。这些工具可以自动分析查询的执行计划、索引使用情况、查询语句的性能瓶颈等,并提供优化建议和调优方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/814609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Github远程仓库改名字之后,本地git如何配置?

文章目录 缘由解决方案 缘由 今天在github创建一个仓库,备份一下本地电脑上的资料。起初随便起一个仓库名字,后来修改之。既然远程仓库改名,那么本地仓库需要更新地址。这里采用SSH格式。 解决方案 如果你的GitHub仓库改名了,你…

Python基于大数据的微博的舆论情感分析,微博评论情感分析可视化系统,附源码

博主介绍:✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不…

练习题(2024/4/13)

1长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1&am…

2024.4.14每日一题

LeetCode 设计哈希集合 题目链接:705. 设计哈希集合 - 力扣(LeetCode) 题目描述 不使用任何内建的哈希表库设计一个哈希集合(HashSet)。 实现 MyHashSet 类: void add(key) 向哈希集合中插入值 key 。…

1. 软件是如何访问硬件的

1 软件是如何访问硬件的 操作系统作为硬件层的上层,是对硬件的管理和抽象。对于操作系统上面的运行库和应用程序来说,他们希望看到的是一个统一的硬件访问模式。作为应用程序开发者,不希望在开发应用程序的时候直接读写硬件端口、处理硬件中断…

Linux第89步_了解异步通知及其结构和函数

1、了解“异步通知” “异步通知”的核心就是信号。信号是采用软件模拟的“中断”,它由“驱动程序”主动向“应用程序”发送信号,并报告自己可以访问了,“应用程序”收到信号以后,就从“驱动设备”中读取或者写入数据。整个过程就…

数据库(4)

目录 16.MySQL主从复制? 17.MySQL主从的延迟是怎么解决的呢? 18.MySQL读写分离方案? 19.什么是Redis,为什么用Redis? 20.为什么Redis是单线程的以及为什么这么快? 16.MySQL主从复制? 主要涉…

杰发科技AC7840——CAN通信简介(3)_时间戳

0. 时间戳简介 时间戳表示的是收到该CAN消息的时刻,通过连续多帧的时间戳,可以计算出CAN消息的发送周期,也可以用于判断CAN消息是否被持续收到。 1. 使用步骤 注意分别是发送和接收的功能: 2. 现象分析_接收时间戳 看下寄存器的…

帝国cms仿《鳄鱼下载站》网站源码

仿《鳄鱼下载站》网站源码手机安卓软件网站模版 PHP网站源码 帝国cms内核 采用帝国cms7.5 环境PHPmysql 恢复数据库后如何修改密码: 双击表,进入对应的详细数据表,然后找到:www_96kaifa_com_enewsuser这个表,双击打开修改&…

mac 配置前端开发环境brew,git,nvm,nrm

我的电脑是mac 3 pro 一、配置Homebrew 打开终端,执行指令 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"查看版本 brew -v 安装nvm brew install nvm 再执行 brew reinstall nvm 我这边安装好了…

Linux 中 CPU 利用率是如何算出来的?

在线上服务器观察线上服务运行状态的时候,绝大多数人都是喜欢先用 top 命令看看当前系统的整体 cpu 利用率。例如,随手拿来的一台机器,top 命令显示的利用率信息如下: 这个输出结果说简单也简单,说复杂也不是那么容易就…

线程池-异步编排-完成时回调-线程串行化

上图中用exceptionally可以感知异常也可以处理返回结果 同时 我们使用handle也可以做到这种情况 线程串行化

error:0308010C:digital envelope routines::unsupported(问题分析)

error:0308010C:digital envelope routines::unsupported 情况一:就是网上大部分人说的node 17版本的问题 出现这个错误是因为 node.js V17版本中最近发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响…

vue iview table实现全选

之前我们在文章《iview Table实现跨页勾选记忆功能以及利用ES6的Map数据结构实现根据id进行对象数组的去重》里实现过全选功能,不过那有一个弊端就是需要调接口一次性获取全部的数据,这会造成请求数据响应超时或报错,因为数据量大的话这样体验也不好,于是我们改了一下,因为…

【数据结构与算法】:二叉树经典OJ

目录 1. 二叉树的前序遍历 (中,后序类似)2. 二叉树的最大深度3. 平衡二叉树4. 二叉树遍历 1. 二叉树的前序遍历 (中,后序类似) 这道题的意思是对二叉树进行前序遍历,把每个结点的值都存入一个数组中,并且返回这个数组。 思路&…

【机器学习300问】66、ReLU激活函数相对于Sigmoid和Tanh激活函数的优点是什么?ReLU它有局限性吗?如何改进?

一、ReLU相对于Sigmoid和Tanh的优点 (1)计算效率高 ReLU函数数学形式简单,仅需要对输入进行阈值操作,大于0则保留,小于0则置为0。Sigmoid和Tanh需要指数运算但ReLU不需要。所以相比之下它会更快,降低了神经…

C++算法题 - 双指针

目录 125. 验证回文串392. 判断子序列167. 两数之和 Ⅱ - 输入有序数组11. 盛最多的水15. 三数之和 125. 验证回文串 LeetCode_link 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 …

滑动窗口例题

一、209:长度最小的子数组 209:长度最小的子数组 思路:1、暴力解法:两层for循环遍历,当sum > target时计算子数组长度并与result比较,取最小的更新result。提交但是超出了时间限制。 class Solution {public int minSubArray…

Object和Objects

Object Object是Java中的顶级父类.所有的类都直接或间接的继承Object类. Object类中的方法可以被所有子类访问,所以我们要学习Object类和其中的方法. Object的构造方法: Object的成员方法 public class test {public static void main(String[] args) {//1.toString 返回对象…

03 Git 之 远程仓库 + IDEA 集成使用 GitHub

1. 远程仓库 origin:即远程仓库 url 的指代。 从网上随意 clone 一个仓库,进入 .git/config 文件, 即可编辑远程仓库的 url,也可以自定义想要指代该 url 的名词。 1.1 本地仓库绑定远程仓库 并 推送、拉取 git remote add 【想要起的指代…