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

数据库是什么?

数据库(Database)是一个组织和存储数据的集合,通常以结构化的形式组织,以便于检索、更新和管理。数据库可以存储各种类型的数据,包括文本、数字、图像、视频等,以及数据之间的关系。

数据库通常由一个或多个数据表组成,每个表包含了一组数据的集合,数据表由行(记录)和列(字段)组成。每一行表示一个数据记录,每一列表示一个数据字段,每个字段包含了特定类型的数据。

数据库提供了一种结构化数据的管理方式,使得用户可以方便地进行数据的存储、检索、更新和删除。数据库还提供了事务管理、安全性、完整性和并发控制等功能,以保证数据的一致性、可靠性和安全性。

数据库按照数据的组织方式可以分为多种类型,常见的包括关系型数据库(如MySQL、Oracle、SQL Server)、非关系型数据库(NoSQL数据库,如MongoDB、Redis)、内存数据库、文档数据库等。

总的来说,数据库是一种用于组织和管理数据的系统,为应用程序和用户提供了高效、可靠和安全的数据存储和管理服务。

数据库有哪几种类型?

数据库可以按照数据的组织方式和存储结构等多种方式进行分类。以下是常见的几种数据库类型:

  1. 关系型数据库(RDBMS)

    • 关系型数据库是基于关系模型(或称表格模型)的数据库,数据以表格的形式存储,表格由行和列组成,数据之间通过关系进行关联。
    • 关系型数据库具有严格的数据结构,支持事务处理和 SQL 查询语言,具有良好的数据一致性和完整性。
    • 常见的关系型数据库包括 MySQL、Oracle、SQL Server、PostgreSQL、SQLite 等。
  2. 非关系型数据库(NoSQL)

    • 非关系型数据库是一种不使用传统的关系型表格来组织数据的数据库,数据以键值对、文档、列族或图等形式存储。
    • 非关系型数据库通常具有高度可扩展性、灵活的数据模型和较低的一致性要求,适用于大数据和分布式环境。
    • 常见的非关系型数据库包括 MongoDB、Redis、Cassandra、Couchbase、Neo4j 等。
  3. 文档数据库

    • 文档数据库是一种非关系型数据库,数据以类似于 JSON 格式的文档形式存储,每个文档包含了一个或多个字段及其对应的值。
    • 文档数据库适用于存储和查询半结构化数据,具有灵活的数据模型和高效的数据查询能力。
    • 常见的文档数据库包括 MongoDB、Couchbase、CouchDB 等。
  4. 列式数据库

    • 列式数据库是一种以列族(column family)为单位存储数据的数据库,数据以列的形式存储,每个列族包含了一组列。
    • 列式数据库适用于分析型应用场景,具有高效的数据读取和压缩存储能力。
    • 常见的列式数据库包括 HBase、Cassandra 等。
  5. 内存数据库

    • 内存数据库是一种将数据存储在内存中的数据库,具有极高的读写性能和低延迟,适用于对性能要求较高的应用场景。
    • 内存数据库通常用于缓存、实时数据分析等场景,数据一般不持久化到磁盘。
    • 常见的内存数据库包括 Redis、Memcached、Apache Ignite 等。

第三范式(3NF)与第二范式的区别是什么?

第三范式(3NF)和第二范式(2NF)是关系数据库设计中的两个重要范式,它们有以下主要区别:

  1. 第二范式(2NF)

    • 第二范式要求一个关系中的所有非主属性都完全依赖于主键,即关系中的每个非主属性必须完全依赖于候选键,而不是部分依赖。
    • 如果一个关系不满足第二范式,就存在部分函数依赖,需要将关系进行分解,以消除这种部分函数依赖关系。
  2. 第三范式(3NF)

    • 第三范式要求一个关系中的所有非主属性都不传递依赖于主键,即关系中的每个非主属性必须直接依赖于候选键,而不是传递依赖于其他非主属性。
    • 如果一个关系不满足第三范式,就存在传递函数依赖,需要将关系进行分解,以消除这种传递函数依赖关系。

总的来说,第二范式关注的是属性对主键的完全依赖,而第三范式关注的是属性对主键的传递依赖。通过遵循这些范式,可以设计出结构良好、性能优良的关系数据库模式。

触发器的使用场景有哪些?

触发器(Trigger)是数据库管理系统中的一种特殊类型的存储过程,它是与表相关联的一段代码,当表上的特定事件发生时自动执行。触发器通常用于在数据库中实现数据完整性约束、业务逻辑、审计跟踪等功能。以下是触发器常见的使用场景:

  1. 数据完整性约束:触发器可以用于实现数据完整性约束,例如在插入、更新或删除操作之前或之后执行数据验证和校验。

  2. 业务逻辑:触发器可以用于执行与业务逻辑相关的操作,例如计算字段值、更新相关表的数据、发送通知等。

  3. 审计跟踪:触发器可以用于实现审计跟踪功能,例如记录用户对数据的修改操作、记录数据变更的时间和原因等。

  4. 级联操作:触发器可以用于实现级联操作,例如在主表更新或删除时自动更新或删除相关联的从表数据。

  5. 日志记录:触发器可以用于记录数据库操作的日志,例如记录用户的登录和退出操作、记录数据访问情况等。

  6. 自动化任务:触发器可以用于执行定期或定时的自动化任务,例如定时清理过期数据、定期备份数据库等。

  7. 性能优化:触发器可以用于实现一些性能优化操作,例如在数据访问频繁的字段上创建索引、缓存频繁查询的结果等。

总的来说,触发器可以在数据库中实现各种功能和业务逻辑,提高数据库的数据完整性、安全性和可靠性,同时也可以简化应用程序的开发和维护工作。然而,触发器的使用也需要谨慎,因为触发器可能会对数据库的性能产生影响,过多或不当地使用触发器可能会导致性能下降和维护困难。

数据库索引根据结构分为哪几类?

根据结构,数据库索引可以分为以下几类:

  1. 单值索引(Single-Value Index)

    • 单值索引是最常见的索引类型,它以单个列的值作为索引键。单值索引可以用于加速针对单个列的查询,例如等值查询、范围查询等。
  2. 组合索引(Composite Index)

    • 组合索引是由多个列的值组合而成的索引。组合索引可以用于加速针对多个列的查询,例如包含多个条件的查询、多列排序的查询等。
  3. 唯一索引(Unique Index)

    • 唯一索引是保证索引列中的值唯一的索引,即索引列的值不能重复。唯一索引可以用于加速对唯一性约束的检查和重复值的排除。
  4. 聚集索引(Clustered Index)

    • 聚集索引是按照索引键的顺序组织表的物理存储结构的索引。在聚集索引中,表的数据行按照索引键的顺序进行存储,因此聚集索引决定了表的物理排序顺序。
    • 注意:一个表只能有一个聚集索引,因为聚集索引决定了表的物理存储顺序。
  5. 非聚集索引(Non-Clustered Index)

    • 非聚集索引是不会改变表的物理存储结构的索引。在非聚集索引中,索引键的顺序与表的物理存储顺序没有关系,因此非聚集索引与表的物理存储结构是分开的。
    • 一个表可以有多个非聚集索引,用于加速多个列的查询、覆盖索引等场景。
  6. 全文索引(Full-Text Index)

    • 全文索引是针对文本字段中的关键词进行全文检索的索引。全文索引可以用于加速对文本字段的搜索、匹配和排序。
  7. 空间索引(Spatial Index)

    • 空间索引是针对空间数据(例如地理信息、几何数据等)进行索引的特殊索引类型。空间索引可以用于加速空间数据的查询和分析。

这些不同类型的索引可以根据具体的需求和场景选择合适的索引类型,以提高查询性能和数据的访问效率。

B+ Tree 与 B-Tree 的结构很像,但是也有自己的特性,它的有哪些?

B+树(B+ Tree)和B树(B-Tree)是常用的用于在数据库和文件系统中实现索引的数据结构,它们在结构上类似但在特性上有一些不同:

  1. 节点结构

    • B+树的非叶子节点只存储索引键,不存储数据记录,而叶子节点包含所有的数据记录和指向下一个叶子节点的指针。
    • B树的每个节点都包含索引键和对应的数据记录,即非叶子节点也存储部分数据记录。
  2. 叶子节点结构

    • B+树的叶子节点是通过链表进行连接的,叶子节点之间有一个链表连接起来,这样可以支持范围查询和顺序遍历。
    • B树的叶子节点不需要连接,因为每个叶子节点都包含了部分数据记录,可以通过非叶子节点进行跳跃搜索。
  3. 查找性能

    • 由于B+树的非叶子节点不存储数据记录,因此可以存储更多的索引键,从而降低树的高度,提高了查找效率。
    • B树由于每个节点都包含了部分数据记录,树的高度相对较低,因此在某些情况下可能比B+树的查找效率更高。
  4. 范围查询

    • B+树由于叶子节点之间的链表连接,支持范围查询和顺序遍历,因此适合用于范围查询和排序操作。
    • B树虽然也可以进行范围查询,但是相对来说不如B+树高效。
  5. 插入和删除操作

    • B+树的插入和删除操作相对复杂一些,需要调整链表连接以及维护叶子节点的顺序。
    • B树的插入和删除操作相对简单一些,因为每个节点都包含数据记录,不需要调整链表连接。

B+树适用于范围查询和顺序遍历的场景,由于叶子节点之间的链表连接,B+树更适合用于数据库索引等需要频繁进行范围查询和排序的场景;而B树适用于需要频繁进行插入和删除操作的场景,由于每个节点都包含数据记录,B树在这些场景下可能更高效。

Hash 索引和 B+ 树索引哪个不支持模糊查询以及多列索引的最左前缀匹配?为什么?

Hash索引和B+树索引都支持模糊查询和多列索引的最左前缀匹配,但是它们对这些操作的支持方式和效率略有不同:

  1. Hash索引

    • Hash索引是基于哈希表实现的索引结构,它通过哈希函数将索引键映射到哈希桶中,然后在桶内进行查找。
    • Hash索引适用于等值查询,即通过精确匹配查找特定值。对于模糊查询,如范围查询、通配符查询等,Hash索引效率较低,因为它无法进行顺序遍历。
    • Hash索引不支持多列索引的最左前缀匹配,因为哈希函数是对单个键值进行计算的,无法处理多个键值的组合。
  2. B+树索引

    • B+树索引是一种多叉树结构,适用于范围查询、模糊查询等操作。它通过在叶子节点上存储数据记录和指向下一叶子节点的指针来支持顺序遍历。
    • B+树索引支持模糊查询和范围查询,因为它可以通过顺序遍历叶子节点来找到满足条件的数据记录。
    • B+树索引支持多列索引的最左前缀匹配,因为B+树的内部节点会存储多列的键值,查询时可以按照多列键值的顺序进行搜索,从而实现最左前缀匹配。

综上所述,虽然Hash索引和B+树索引都支持模糊查询和多列索引的最左前缀匹配,但是它们的实现方式和效率有所不同。Hash索引适用于等值查询,而B+树索引更适用于范围查询和多列索引的最左前缀匹配。

添加索引时需要注意哪些原则?

在添加索引时,需要注意以下原则:

  1. 选择合适的列

    • 选择经常用于查询条件的列添加索引,尤其是经常用于 WHERE 子句、JOIN 子句和 ORDER BY 子句的列。
    • 不要为很少或从不用于查询条件的列添加索引,因为这样会增加索引维护的开销,而带来的查询性能提升可能不值得。
  2. 避免过度索引

    • 不要为每个列都添加索引,要根据实际查询需求和数据访问模式进行选择,避免过度索引导致不必要的性能损失和额外的存储空间占用。
    • 综合考虑查询的频率、数据量、查询效率等因素,进行适度的索引设计。
  3. 选择合适的索引类型

    • 根据具体的查询需求和数据库引擎的特性,选择合适的索引类型,如单值索引、组合索引、唯一索引、全文索引等。
    • 不同的索引类型适用于不同的查询场景,要根据实际需求选择合适的索引类型。
  4. 定期维护索引

    • 定期监控索引的使用情况和性能影响,根据实际情况对索引进行调整和优化,包括添加新索引、删除不必要的索引、重新构建索引等。
    • 随着数据量和查询模式的变化,索引的优化策略也需要不断地调整和优化。
  5. 考虑事务和并发性

    • 在添加索引时,要考虑到事务的影响和并发访问的效率,避免因索引而导致的锁竞争、死锁等问题。
    • 尽量减少长事务中的索引修改操作,避免长时间持有锁导致其他事务阻塞。
  6. 评估索引的成本和收益

    • 在添加索引前,要评估索引对查询性能的提升和索引维护的成本,确保索引的收益大于成本。
    • 对于频繁执行的查询,添加索引可以提高查询性能;对于很少执行的查询,添加索引可能会增加维护成本而带来较少的收益。

什么是数据库事务?

数据库事务(Database Transaction)是指数据库管理系统(DBMS)中的一组操作,这些操作被视为一个逻辑单元,要么全部成功执行,要么全部失败,具有以下四个特性,通常缩写为ACID:

  1. 原子性(Atomicity):事务是一个原子操作,要么全部执行成功,要么全部执行失败。如果事务中的任何一个操作失败,整个事务都会被回滚到开始状态,数据库状态不会受到破坏。

  2. 一致性(Consistency):事务在执行前后,数据库的完整性约束都必须得到保持。换句话说,事务执行后,数据库从一个一致性状态转移到另一个一致性状态,不会破坏数据的完整性、约束和规则。

  3. 隔离性(Isolation):事务的执行应该是相互隔离的,即一个事务的执行不应该影响其他事务的执行。在并发环境下,隔离性要求并发执行的事务互不干扰,每个事务都应该感觉到其他事务要么在它之前执行,要么在它之后执行。

  4. 持久性(Durability):一旦事务提交成功,其所做的修改将永久保存在数据库中,并且对其他事务是可见的。即使系统崩溃或发生故障,已经提交的事务对数据库的修改也应该得以保留,不会丢失。

数据库事务是确保数据操作的一致性、完整性和可靠性的重要机制,在数据库应用程序中被广泛应用。通过事务,可以将一组相关的数据库操作看作一个逻辑单元,从而保证数据的正确性和可靠性。

事务具有哪 4 个特性?

事务具有以下四个特性,通常被称为ACID特性:

  1. 原子性(Atomicity):事务是一个原子操作,要么全部执行成功,要么全部执行失败。如果事务中的任何一个操作失败,整个事务都会被回滚到开始状态,数据库状态不会受到破坏。

  2. 一致性(Consistency):事务在执行前后,数据库的完整性约束都必须得到保持。换句话说,事务执行后,数据库从一个一致性状态转移到另一个一致性状态,不会破坏数据的完整性、约束和规则。

  3. 隔离性(Isolation):事务的执行应该是相互隔离的,即一个事务的执行不应该影响其他事务的执行。在并发环境下,隔离性要求并发执行的事务互不干扰,每个事务都应该感觉到其他事务要么在它之前执行,要么在它之后执行。

  4. 持久性(Durability):一旦事务提交成功,其所做的修改将永久保存在数据库中,并且对其他事务是可见的。即使系统崩溃或发生故障,已经提交的事务对数据库的修改也应该得以保留,不会丢失。

这四个特性确保了事务的正确执行、数据的一致性和可靠性,是数据库管理系统中的核心概念。

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmiledrinkCat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值