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

2024-04-14 10:04
文章标签 c++ day 八股 速记

本文主要是介绍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. 数据库性能优化工具

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

这篇关于7天八股速记之C++后端——Day 4的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/902734

相关文章

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准