本文主要是介绍7天八股速记之C++后端——Day 4,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
坚持7天,短期内快速完成C++后端面试突击。每天10题,弥补后端八股知识缺漏,熟练掌握后端的高频考点,后端面试更有把握。
1. 一条 SQL 语句在数据库框架中的执行流程?
-
连接数据库:
- 客户端应用程序通过数据库连接池或者直接建立数据库连接,连接到数据库服务器。
-
SQL解析:
- 数据库服务器接收到客户端发送的SQL语句后,首先进行SQL解析,包括语法分析、语义分析等,确保SQL语句的正确性和合法性。
-
查询优化:
- 解析完成后,数据库服务器将对SQL语句进行查询优化。优化器会根据查询的复杂度、表的大小、索引情况等因素选择最优的执行计划。
-
执行查询计划:
- 优化器生成可执行的查询计划后,数据库服务器会按照该计划执行查询操作。这包括从磁盘或者内存中读取数据、执行过滤条件、执行排序、执行聚合等操作。
-
返回结果:
- 当数据库服务器执行完查询操作后,将结果返回给客户端应用程序。如果是查询语句,返回的结果是查询的结果集;如果是更新语句,返回的结果可能是受影响的行数或者执行状态等。
-
断开连接:
- 客户端应用程序处理完结果后,断开与数据库服务器的连接,释放资源。
2. 数据库的三范式是什么?
-
第一范式(1NF):
- 要求有主键,并且要求每一个字段原子性不可再分。
-
第二范式(2NF):
- 要求所有非主键字段完全依赖主键,不能产生部分依赖。
-
第三范式(3NF):
- 所有非主键字段和主键字段之间不能产生传递依赖。
3. char 和 varchar 的区别?
-
char:
char
是一种固定长度的字符类型,它用于存储固定长度的字符串。- 当定义一个
char(n)
类型的列时,该列将始终占用固定长度的存储空间,无论实际存储的字符串长度是否达到指定的长度n
。 - 如果存储的字符串长度小于指定的长度
n
,则系统会使用空格来填充,保证占用的存储空间达到指定的长度。
-
varchar:
varchar
是一种可变长度的字符类型,它用于存储可变长度的字符串。- 当定义一个
varchar(n)
类型的列时,该列占用的存储空间取决于实际存储的字符串长度,而不是固定的。 - 与
char
不同,varchar
存储的实际字符串长度不会被填充,而是根据实际需要动态分配存储空间。
主要区别总结如下:
char
存储固定长度的字符串,varchar
存储可变长度的字符串。char
占用的存储空间固定,不受实际字符串长度影响,而varchar
占用的存储空间取决于实际字符串长度。- 在存储大量短字符串或者长度差异较大的情况下,
varchar
通常比char
更节省存储空间。 - 在执行检索、排序和比较等操作时,由于
char
的存储长度固定,可能会更快,但在存储空间方面varchar
更灵活。
4. varchar(10) 和 varchar(20) 的区别?
varchar(10)
和 varchar(20)
的区别在于能够存储的字符串的最大长度:
-
varchar(10):
varchar(10)
表示该列可以存储最多10个字符的可变长度字符串。- 如果插入的字符串长度超过10个字符,数据库会截断超出部分,只存储前10个字符。
- 如果插入的字符串长度不超过10个字符,则数据库会完整地存储该字符串,不会填充多余的空格。
-
varchar(20):
varchar(20)
表示该列可以存储最多20个字符的可变长度字符串。- 如果插入的字符串长度超过20个字符,数据库会截断超出部分,只存储前20个字符。
- 如果插入的字符串长度不超过20个字符,则数据库会完整地存储该字符串,不会填充多余的空格。
varchar(n)
中的 n
表示该列可以存储的字符串的最大长度,超过最大长度的部分会被截断,而不会抛出错误。不同的 varchar(n)
之间的区别在于允许存储的最大长度不同。
5. 索引的底层使用的是什么数据结构?
索引在关系型数据库中通常使用B树(B-tree)或者B+树(B+ tree)作为底层数据结构。
-
B树:
- B树是一种多路搜索树,通常用于数据库索引中。它具有以下特点:
- 每个节点可以包含多个子节点,通常称为分支节点。
- 每个节点中的关键字都按照顺序排列,并且与其对应的子节点之间有序地分割关键字空间。
- 所有叶子节点都位于相同的深度,形成一个平衡的树结构。
- B树的特点使得它适用于在磁盘上存储索引数据,因为它能够最小化磁盘I/O次数。
- B树是一种多路搜索树,通常用于数据库索引中。它具有以下特点:
-
B+树:
- B+树是在B树基础上进行改进的一种数据结构。与B树相比,B+树具有以下特点:
- 所有关键字都存储在叶子节点上,非叶子节点只包含关键字的索引信息。
- 叶子节点之间通过指针连接形成链表,方便范围查询。
- 非叶子节点的关键字范围覆盖其子节点的关键字范围。
- B+树的特点使得它在数据库索引中更为常见,因为它具有更好的顺序访问性能和更高的存储效率。
- B+树是在B树基础上进行改进的一种数据结构。与B树相比,B+树具有以下特点:
6. 聚簇索引
聚簇索引(Clustered Index)是一种特殊类型的索引,它对数据库表中的数据行进行排序,并且将数据存储在索引的叶子节点中,而不是在独立的数据页中。换句话说,聚簇索引决定了数据在磁盘上的物理存储顺序,因此表中的数据行实际上是按照聚簇索引的顺序排列的。
聚簇索引的特点包括:
-
物理排序:数据行按照聚簇索引的顺序存储在磁盘上,这使得范围查询和顺序扫描的性能得到了显著的提升。
-
唯一性:由于聚簇索引决定了数据行的物理存储顺序,因此每个表只能有一个聚簇索引。如果表上已经存在了聚簇索引,则该表的主键约束将自动成为聚簇索引。
-
覆盖查询:如果查询的列恰好是聚簇索引中的列,那么数据库可以直接从聚簇索引中读取数据,而不需要再额外访问数据行。这种情况下称为覆盖查询,可以减少I/O开销。
-
索引维护代价:由于聚簇索引决定了数据的物理存储顺序,因此插入、删除、更新等操作都可能导致数据行的物理重新排序,从而增加了维护索引的代价。
7. 谈谈你对哈希索引的理解?
哈希索引(Hash Index)是一种在关系型数据库中常见的索引类型,它通过哈希函数将索引键值映射到索引表中的存储位置,从而加速对索引列的查找操作。哈希索引的主要特点包括:
-
快速查找:哈希索引通过哈希函数直接计算索引键值在索引表中的存储位置,因此可以快速定位到目标数据,实现常数时间复杂度的查询操作。
-
适用于等值查询:哈希索引适用于等值查询,即通过索引键值精确匹配目标数据。对于等值查询,哈希索引通常具有较高的查询性能。
-
不支持范围查询:由于哈希函数的特性,哈希索引不支持范围查询,无法直接进行大于、小于或区间查询等操作。
-
冲突处理:由于哈希函数的映射可能会导致多个不同的键值映射到同一个存储位置,即发生哈希冲突。为了处理冲突,通常使用开放地址法、链地址法等技术。
-
数据分布均匀性:哈希索引的性能受到哈希函数的影响,良好的哈希函数可以使数据分布均匀,减少冲突的发生,提高索引的效率。
-
适用场景:哈希索引适用于等值查询频繁且数据分布均匀的场景,例如主键、唯一键等。但对于范围查询频繁的情况,哈希索引的性能可能不如B树或B+树索引。
8. 谈谈你对覆盖索引的认识?
覆盖索引(Covering Index)是一种索引优化技术,它通过创建包含查询所需的所有列的索引,从而避免了查询需要额外访问数据行的情况,减少了I/O开销,提高了查询性能。具体而言,覆盖索引具有以下特点:
-
减少数据访问:覆盖索引包含了查询所需的所有列,因此当数据库执行查询时,可以直接从索引中获取查询所需的数据,而不需要额外访问数据行。这可以减少磁盘I/O次数和数据缓存的使用,提高了查询性能。
-
减少索引扫描:对于覆盖索引来说,数据库可以直接从索引中获取查询结果,而不需要进行全表扫描或者索引扫描。这可以大大减少查询的时间复杂度,特别是对于大型表或者复杂查询的情况。
-
适用范围:覆盖索引通常适用于查询中只涉及到索引列和查询列的情况。如果查询中需要获取的列都包含在索引中,那么数据库可以直接使用覆盖索引来满足查询需求,而不需要额外访问数据行。
-
提高性能:由于覆盖索引可以减少数据访问和索引扫描,因此可以显著提高查询性能,特别是对于频繁执行的查询或者对性能要求较高的场景。
-
索引设计:为了使用覆盖索引,需要合理设计索引,确保索引包含了查询所需的所有列,并且避免创建过多的冗余索引。合理设计和使用覆盖索引可以优化数据库的查询性能和系统的整体性能。
9. 谈谈你对最左前缀原则的理解?
最左前缀原则(Leftmost Prefix Rule)是指在多列索引中,如果查询条件只涉及到了索引的最左边的一部分列,那么数据库可以有效地使用这个多列索引。具体而言,最左前缀原则具有以下几个关键点:
-
索引最左边的列:在一个多列索引中,最左边的列指的是索引中排在最前面的那一列。
-
最左前缀匹配:如果查询条件只涉及到了多列索引的最左边的一部分列,那么数据库可以利用这个索引,即使索引包含了更多的列。这种匹配方式被称为最左前缀匹配。
-
索引的选择:如果查询条件不符合最左前缀原则,即查询涉及到了索引中不是最左边的列,那么数据库可能无法有效地使用这个索引。在这种情况下,数据库可能选择不使用索引,而是进行全表扫描或者其他索引。
-
适用范围:最左前缀原则通常适用于联合索引(Composite Index)的情况,即包含多个列的索引。在联合索引中,如果查询条件只涉及到了索引的最左边的列,那么数据库可以使用这个索引来加速查询操作。
10. 怎么知道创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?
要知道创建的索引是否被查询语句使用到,以及找出语句运行缓慢的原因,可以通过以下几种方法进行分析:
-
执行计划分析:
- 使用数据库管理系统提供的执行计划工具(如EXPLAIN命令),可以查看查询语句的执行计划。执行计划会显示查询优化器选择的索引、访问方式以及是否使用了索引。如果执行计划中显示使用了索引,说明该索引被查询语句使用到了。
-
索引统计信息:
- 查询数据库系统的索引统计信息,查看创建的索引的使用情况。大多数数据库系统都提供了系统视图或者系统表,用于查看索引的使用统计信息,例如MySQL中的
SHOW INDEX
命令或者information_schema
系统表。
- 查询数据库系统的索引统计信息,查看创建的索引的使用情况。大多数数据库系统都提供了系统视图或者系统表,用于查看索引的使用统计信息,例如MySQL中的
-
监控工具:
- 使用数据库性能监控工具来监控查询的执行情况和索引的使用情况。这些监控工具通常会提供详细的性能指标和分析报告,帮助识别查询性能问题和索引使用情况。
-
慢查询日志:
- 启用数据库系统的慢查询日志功能,记录执行时间超过阈值的查询语句。通过分析慢查询日志,可以找出执行时间较长的查询语句,进而分析其执行计划和索引使用情况。
-
数据库性能优化工具:
- 使用专门的数据库性能优化工具进行性能分析和调优。这些工具可以自动分析查询的执行计划、索引使用情况、查询语句的性能瓶颈等,并提供优化建议和调优方案。
这篇关于7天八股速记之C++后端——Day 4的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!