大数据面试题之数据库(1)

news/2024/7/7 20:18:26 标签: 大数据, 数据库

目录

数据库中的事务是什么,MySQL中是怎么实现的 

MySQL事务的特性? 

数据库事务的隔离级别?解决了什么问题?默认事务隔离级别? 

脏读,幻读,不可重复读的定义 

MySQL怎么实现可重复读? 

数据库第三范式和第四范式区别? 

MySQL的存储引擎? 

数据库有哪些锁? 

说下悲观锁、乐观锁 

分布式数据库是什么? 

死锁产生的条件是什么?如何预防死锁? 

介绍下数据库的ioin(内连接,外连接,全连接),内连接和外连接(左,右连接)的区别 

MySQL的join过程 

MySQL有哪些存储引擎? 


数据库中的事务是什么,MySQL中是怎么实现的 

数据库中的事务(Transaction)是一种机制,它将一组数据库操作封装成一个逻辑工作单元,确保这组操作要么全部成功执行,要么全部失败回滚,以此维护数据库的一致性和完整性。事务是数据库管理系统(DBMS)中的核心概念,尤其在处理大量复杂数据操作时至关重要。

MySQL,特别是使用InnoDB存储引擎(MySQL的默认存储引擎),实现了事务的ACID特性,这四个特性分别是:

1、原子性(Atomicity):事务中的所有操作被视为一个不可分割的单元,它们要么全部完成,要么完全不起作用。如果事务中的任何部分失败,整个事务都会被回滚,仿佛从未发生过一样。
2、一致性(Consistency):事务执行前后,数据库都保持合法的状态。这意味着事务必须遵循所有的数据完整性规则,包括外键约束、唯一性约束等。
3、隔离性(Isolation):在并发环境中,事务之间互不影响,每个事务都感觉像是在单独操作数据库一样。MySQL提供了不同的事务隔离级别来控制事务间的可见性,包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ,默认级别)和串行化(SERIALIZABLE)。
4、持久性(Durability):一旦事务被提交,其效果就是永久性的,即使系统发生故障,事务的结果也不会丢失。
MySQL中实现事务的常用操作包括:

  • BEGIN; 或 START TRANSACTION; 开始一个新的事务。
  • 执行一系列的SQL操作,比如INSERT、UPDATE、DELETE等。
  • 如果一切正常,使用 COMMIT; 提交事务,所有更改生效。
  • 如果需要取消操作,可以使用 ROLLBACK; 回滚事务,撤销自事务开始以来的所有更改。

InnoDB引擎通过内部的事务日志(redo log和undo log)来保证事务的ACID特性。redo log用于保证事务的持久性,记录事务对数据的修改;undo log则用来实现事务的原子性和一致性,当事务需要回滚时,可以通过undo log恢复数据到事务开始之前的状态。此外,InnoDB还利用多版本并发控制(MVCC)来实现事务的隔离性,允许不同的事务看到符合其隔离级别的数据快照。

MySQL事务的特性? 

MySQL事务具备以下四个基本特性,这些特性通常被概括为ACID:

1、原子性(Atomicity):
原子性确保数据库事务是不可分割的工作单位。事务中的所有操作要么全部执行成功,要么全部失败,不会部分执行。如果事务中的任何一部分操作失败,整个事务就会被回滚,数据库状态会恢复到事务开始前的状态,仿佛事务从未发生过。
2、一致性(Consistency):
一致性保证事务执行前后,数据库的状态都满足所有的数据完整性约束。这意味着事务的执行不会破坏数据库的内部逻辑,比如账户余额的正确性、所有引用的完整性等。事务应该将数据库从一个有效状态转换到另一个有效状态。
3、隔离性(Isolation):
隔离性确保并发执行的事务之间互不干扰。在MySQL中,通过设置不同的事务隔离级别(如读未提交、读已提交、可重复读、串行化)来控制事务之间的可见性,以防止脏读、不可重复读和幻读等问题。
4、持久性(Durability):
持久性意味着一旦事务被提交,它引起的数据变化就会被永久保存到数据库中,即使系统发生故障(如电源故障、系统崩溃等),这些改变也不会丢失。MySQL通过redo log(重做日志)来确保事务的持久性,即使在提交后发生故障,也能通过redo log恢复数据。
这些特性共同确保了数据库事务的安全性和可靠性,使得在多用户环境下的数据操作更加有序和可控。

数据库事务的隔离级别?解决了什么问题?默认事务隔离级别? 

数据库事务的隔离级别是用来定义一个事务可能受其他并发事务影响的程度。它主要解决的是数据库在并发环境下的数据一致性和隔离性问题。事务的隔离级别通过锁定数据库资源来避免并发事务所带来的问题,如脏读、不可重复读和幻读。

数据库事务的隔离级别
1、读未提交(Read Uncommitted):

  • 最低的隔离级别,允许一个事务读取另一个事务未提交的数据。这可能导致脏读(Dirty Read),即读取到未提交的数据变更。

2、读已提交(Read Committed):

  • 允许事务读取已经被其他事务提交的数据。这可以防止脏读,但可能出现不可重复读(Nonrepeatable Read),即在同一事务内,多次读取同一数据集合时,由于其他事务的更新,导致多次读取的数据不一致。

3、可重复读(Repeatable Read):

  • 确保在同一事务内,多次读取同一数据集合的结果是一致的。这通过阻止不可重复读来实现,但无法解决幻读(Phantom Read)问题,即在同一事务内,当两个相同的查询执行时,由于其他事务的插入操作,第二次查询返回了更多的行。

4、串行化(Serializable):

  • 最高的隔离级别,它通过强制事务串行执行,来避免脏读、不可重复读和幻读。但这会大大降低系统的并发性能。

解决的问题

  • 脏读:一个事务读取到另一个事务未提交的数据。
  • 不可重复读:在同一事务内,多次读取同一数据集合时,由于其他事务的更新操作,导致读取的数据不一致。
  • 幻读:在同一事务内,当两个相同的查询执行时,由于其他事务的插入操作,第二次查询返回了更多的行。

默认事务隔离级别
不同的数据库系统默认的事务隔离级别可能不同。例如:

  • MySQL:在InnoDB存储引擎中,默认的事务隔离级别是可重复读(Repeatable Read)。
  • SQL Server 和 PostgreSQL:默认的事务隔离级别是读已提交(Read Committed)。
  • Oracle:默认的事务隔离级别是可序列化(Serializable),但在实践中通常表现为读已提交(Read Committed),因为Oracle使用了多版本并发控制(MVCC)技术。

脏读,幻读,不可重复读的定义 

1、脏读(Dirty Read):
脏读发生在一个事务读取了另一个事务未提交的数据时。由于被读取的数据尚未被提交,因此它可能随后被回滚(撤销),导致第一个事务读取到的数据是无效的或不一致的。这种读取方式被称为脏读,因为它读取了“脏”数据(即可能永远不会成为永久部分的数据)。
2、不可重复读(Nonrepeatable Read):
不可重复读发生在一个事务内,多次读取同一数据集合时,由于其他事务的更新操作(包括插入、删除或更新),导致多次读取的结果不一致。即使读取操作发生在同一个事务内,由于并发事务的干扰,也无法保证数据的重复读取结果相同。这违反了事务的隔离性要求,因为事务应该能够在不受其他事务干扰的情况下多次读取同一数据并得到相同的结果。
3、幻读(Phantom Read):
幻读是不可重复读的一种特殊情况,但它主要关注于数据集的“幻影”出现。当一个事务重新执行一个查询,并且返回了一个满足查询条件的行集合,但在第二次执行相同的查询时,由于另一个并发事务的插入操作,返回了额外的行(即幻影行),那么这就是幻读。幻读的重点在于它涉及到了新行的出现,而不仅仅是现有行的更改。

MySQL怎么实现可重复读? 

在InnoDB存储引擎中。以下是实现可重复读的关键步骤和组件:

1、事务ID(Trx_ID)与Undo日志:
每个事务在InnoDB中都有一个唯一的事务ID(Trx_ID),并且每当有数据修改时,InnoDB不仅修改数据本身,还会在Undo日志中记录旧版本的数据以及修改该数据的事务ID。这样,每一行数据实际上关联了多个版本,每个版本对应不同事务修改的快照。
2、一致性视图(Consistent Read View):
当一个事务以可重复读级别启动时,MySQL会创建一个一致性视图。这个视图包含了当时所有活跃事务的ID列表(即未提交的事务ID)。这个视图会在事务的生命周期内保持不变,确保事务看到的数据就像在事务开始时那样,不会受到其他事务后续提交的影响。
3、版本选择规则:
在事务执行读操作时,会根据一致性视图来决定应该返回哪个版本的数据。对于每一行数据,只有在该行的最新版本是在事务视图创建之前就已经提交的事务所生成的,或者是由尚未提交但事务ID小于当前事务ID的事务所修改的,才会被当前事务看到。否则,事务将根据Undo日志回溯到该行的一个更旧版本,以确保数据的一致性和可重复性。
4、行级锁辅助:
虽然主要依赖MVCC,InnoDB在某些场景下也会使用行级锁来辅助实现隔离性,比如在更新操作时。但是,在可重复读隔离级别下,行锁主要用于保护更新操作,而读操作通常不需要加锁(因为MVCC机制已经足够保证可重复读)。

数据库第三范式和第四范式区别? 

数据库第三范式(3NF)和第四范式(4NF)都是关系数据库设计中的规范化原则,旨在减少数据冗余和提高数据一致性。它们的区别在于处理数据依赖性的深度不同:

第三范式(3NF):

  • 在满足第二范式(2NF)的基础上,3NF要求每一个非主属性都直接依赖于任何候选键,而不能传递依赖于候选键。换句话说,如果存在非主属性A依赖于另一个非主属性B,而B又依赖于候选键的情况,这就违反了3NF。要达到3NF,需要消除这种传递依赖,即将相关联的非主属性移到另一个表中,通过外键关联起来。
  • 目的在于进一步减少数据冗余,使得更新更加高效,减少因数据维护导致的异常情况。

第四范式(4NF):

  • 在满足3NF的基础上,4NF关注于消除多值依赖(Multi-Value Dependency, MVD)。多值依赖发生在当一个非主属性集的值依赖于另一个非主属性集的多值属性时,且这种依赖不是函数依赖的一部分。简单来说,如果一个表中存在某个属性集,其值可以根据另一个非主属性集的不同值集合有不同的子集,则存在多值依赖。
  • 为了达到4NF,可能需要将表进一步拆分,确保每个表只表达一种概念,每个非主属性都不依赖于其他非主属性的多值属性。
  • 目的是确保数据的更高级别纯净度,避免在处理复杂数据时出现数据不一致或冗余问题。

MySQL的存储引擎? 

MySQL的存储引擎是MySQL数据库管理系统中用于存储、处理和保护数据的核心组件。不同的存储引擎具有不同的特性、优势和适用场景。以下是关于MySQL存储引擎的详细解答:

一、MySQL存储引擎概述
MySQL支持多种存储引擎,这些存储引擎在数据的存储方式、索引技巧、锁定水平以及功能支持等方面存在差异。存储引擎是基于表的,可以在创建表时指定使用哪种存储引擎,如果没有指定,则使用默认的存储引擎。MySQL的存储引擎架构使得用户可以根据应用需求选择合适的存储引擎,从而优化数据库的性能和功能。

二、常用存储引擎
1. InnoDB
特点:

  • 事务支持:提供事务安全(ACID兼容)的表,支持提交、回滚和崩溃恢复能力。
  • 行级锁定:支持行级锁定,提高并发访问性能。
  • 外键约束:支持外键约束,确保数据的完整性和正确性。
  • 崩溃恢复:内置崩溃恢复机制,通过redo日志和undo日志来恢复未完成的事务和回滚已提交的事务。
  • 聚簇索引:采用聚簇索引,数据行和相邻的键值索引存储在一起,优化了点查询和范围查询的性能。
  • 缓冲池:使用缓冲池技术,将频繁读写的页缓存在内存中,减少磁盘I/O操作。

适用场景:适用于需要高并发读写、事务支持和数据完整性的应用场景。
2. MyISAM
特点:

  • 非事务性:不支持事务处理,每个查询都是原子性的,但无法回滚。
  • 表级锁定:使用表级锁定,可能导致较低的并发性能。
  • 全文索引:支持全文索引,适用于全文搜索的应用场景。
  • 快速读取:对于只读或大量读取的应用,通常提供较快的查询性能。

适用场景:适用于只读或大量读取的应用,以及需要进行全文搜索的场景。但在高并发写入或需要保证数据一致性的场景中可能不是最佳选择。
3. MEMORY
特点:

  • 内存存储:数据存储在内存中,提供非常快的访问速度。
  • 表级锁定:支持表级锁定。
  • 数据易失:由于数据存储在内存中,因此数据容量受到内存大小的限制,并且当数据库服务器重启时,数据会丢失。

适用场景:适用于缓存、会话管理等轻量级应用,以及需要快速访问的临时表或小型表。
三、其他存储引擎
除了InnoDB、MyISAM和MEMORY之外,MySQL还支持其他多种存储引擎,如Archive、Federate、CSV、BLACKHOLE等。每种存储引擎都有其特定的用途和优势,用户可以根据实际需求选择合适的存储引擎。

四、如何选择存储引擎
在选择MySQL的存储引擎时,需要考虑以下因素:

  • 事务支持:如果需要事务处理,应选择支持事务的存储引擎,如InnoDB。
  • 并发性能:在高并发场景下,应选择支持行级锁定或并发控制较好的存储引擎。
  • 数据完整性:如果需要保证数据的完整性和正确性,应选择支持外键约束的存储引擎。
  • 读写性能:根据应用的主要读写操作类型选择合适的存储引擎。
  • 存储容量:考虑存储引擎对存储容量的限制和扩展性。

综上所述,MySQL的存储引擎是数据库性能和功能优化的重要手段。通过选择合适的存储引擎,可以充分发挥MySQL数据库的优势,满足各种应用场景的需求。

数据库有哪些锁? 

一、按锁级别分类
1、行级锁(Row-level Lock)

  • 锁定表中的单独一行,允许其他事务并发访问表中的其他行。
  • 优点:并发度高,冲突概率低。
  • 缺点:锁定开销大,可能会出现死锁。

2、表级锁(Table-level Lock)

  • 锁定整张表,当一个事务对表进行操作时,其他事务无法对表进行写操作,但可能可以进行读操作(取决于锁的类型)。
  • 优点:实现简单,开销小。
  • 缺点:并发度低,容易影响其他事务。

3、页级锁(Page-level Lock)

  • 锁定表中的一个页(页是数据库存储的基本单位,通常包含多行数据)。
  • 适用于只需锁定部分数据的情况,是行级锁和表级锁的一种折衷。

二、按锁模式分类
1、共享锁(Shared Lock)

  • 也称为读锁(Read Lock)。
  • 允许多个事务同时读取一个资源,但不允许其他事务修改该资源。
  • 在SQL中,可以通过SELECT ... LOCK IN SHARE MODE来显式地获取共享锁。

2、排他锁(Exclusive Lock)

  • 也称为写锁(Write Lock)。
  • 保证在当前事务操作资源的过程中,其他事务不能读取或写入该资源。
  • 在SQL中,可以通过SELECT ... FOR UPDATE来显式地获取排他锁。

三、其他锁类型
1、意向锁(Intention Lock)

  • 用于表示接下来将在某个层次上加锁。
  • 分为意向共享锁(IS)和意向排他锁(IX)。
  • 例如,事务打算在某个表上加行级锁时,就需要先获取表级意向排他锁。

2、间隙锁(Gap Lock)

  • 主要用于解决幻读问题。
  • 锁定一定范围内的数据,防止其他事务插入或删除该范围内的数据。

3、自增锁(Auto-increment Lock)

  • 是一种特殊的表级别锁,用于管理具有AUTO_INCREMENT属性的列。
  • 当插入新记录时,确保AUTO_INCREMENT值的唯一性和连续性。

4、悲观锁(Pessimistic Lock)

  • 悲观锁是由数据库自己实现的,它假设最坏的情况,即每次操作都可能会发生冲突。
  • 因此,在操作数据时,会先加锁,保证数据的一致性。

5、乐观锁(Optimistic Lock)

  • 乐观锁不是数据库自带的,需要程序员自己实现。
  • 它假设最好的情况,即每次操作都不会发生冲突。
  • 在更新数据时,会检查数据是否被其他事务修改过,如果没有,则进行更新;如果有,则根据具体的应用场景进行处理。

说下悲观锁、乐观锁 

悲观锁(Pessimistic Lock)和乐观锁(Optimistic Lock)是两种不同的并发控制策略,用于处理多线程或多进程访问同一资源时可能产生的数据竞争问题,尤其是在数据库系统中。

悲观锁
概念:悲观锁假设最坏的情况,即每次数据操作都可能发生并发冲突,因此在数据被读取或修改前就将其锁定,阻止其他事务并发访问,直到当前事务结束(提交或回滚)。这种锁机制较为保守,适合写操作远多于读操作、并发写入频繁的场景。

特点:

独占访问:一旦上锁,其他事务必须等待锁释放才能访问该资源。
性能影响:可能导致大量的等待时间,尤其是在高并发环境下,可能会引发锁竞争,影响整体性能。
实现方式:在数据库层面,可以通过显式锁定(如SELECT ... FOR UPDATE、LOCK TABLE)来实现悲观锁。
乐观锁
概念:乐观锁则假设最乐观的情况,即数据一般不会发生并发冲突,只在数据提交更新时检查在此期间是否有其他事务修改了数据。它不进行实际的加锁操作,而是在数据表中增加一个版本号或时间戳字段来实现并发控制。

特点:

非阻塞读取:读取数据时不会加锁,因此不会阻塞其他事务的读取操作,提高了并发读的效率。
冲突检测:在更新数据前检查数据的版本号(或时间戳),如果发现版本号与读取时的不一致,则认为数据已被其他事务修改,当前事务将放弃更新或重新读取数据。
适用场景:适用于读多写少的场景,能较好地平衡并发性和数据一致性。
实现方式:通常需要应用程序层面的支持,通过比较并更新版本号或时间戳字段来实现乐观锁逻辑。
总结
悲观锁和乐观锁各有优势和适用场景。悲观锁适合写操作密集、并发冲突较高的情况,提供严格的并发控制,但可能牺牲一定的并发性能。乐观锁则适用于读多写少、并发冲突较少的场景,能够提供较好的并发性能,但在高并发写入时需要妥善处理冲突重试机制。选择哪种锁机制取决于具体的应用需求和并发访问模式。

分布式数据库是什么? 

分布式数据库是一种数据库技术,它将数据分布在由计算机网络连接的多个节点上的数据库管理系统中。这些节点可以在物理上位于不同的地理位置,但逻辑上它们共同构成一个统一的整体,即一个全局的逻辑数据库。每个节点都有能力自治地处理本地数据,并通过网络与其他节点协同工作,执行全局的数据操作和事务处理。

分布式数据库的关键特征包括:

1、数据分布性:数据不再集中存储在一个单一的服务器上,而是分散在网络中的各个节点上。这有助于数据的地理负载均衡和提高访问速度。
2、场地自治性:每个节点都能独立处理本地的查询和事务,减少了对中心服务器的依赖,增强了系统的响应速度和可用性。
3、统一性:尽管数据物理上分散,但从用户的角度看,数据库表现为一个逻辑上统一的整体。这意味着用户可以透明地访问数据,无需了解数据的具体存储位置。
4、透明性:分布式数据库管理系统(DDBMS)提供了各种级别的透明性,包括位置透明性、复制透明性等,使得用户感觉不到数据的物理分布,可以像操作集中式数据库一样操作分布式数据库
5、数据分片与复制:数据分片是将大表分解为较小的部分,分散到不同节点上。数据复制则是为了提高数据的可靠性和可用性,通过在多个节点上复制数据副本实现。
6、事务管理与数据一致性:分布式数据库需要复杂的事务管理和协调机制来确保数据的一致性,尤其是在不同的数据分片和复制节点之间。
分布式数据库广泛应用于需要高可用性、高性能和大规模数据处理的场景,如电子商务、金融服务、社交网络、物联网和大数据分析等领域。

死锁产生的条件是什么?如何预防死锁? 

死锁产生的条件主要包括以下四个必要条件,这些条件同时满足时会导致死锁的发生:

1、互斥条件(Mutual Exclusion):至少有一个资源必须处于非共享模式,即一次只能被一个进程占用。如果一个资源正被一个进程使用,其他需要该资源的进程必须等待。
2、请求与保持条件(Hold and Wait):一个进程已经占有了至少一个资源,但仍然请求额外的资源,同时不释放已占有的资源。
3、不可剥夺条件(No Preemption):已经分配给一个进程的资源在未使用完毕之前,不能被其他进程强行夺取,只能由该进程自愿释放。
4、循环等待条件(Circular Wait):存在一种进程资源的循环等待链,链中的每个进程已获得的资源同时被链中下一个进程所请求。
为了预防死锁,可以采取以下策略来破坏上述四个条件之一:

1、破坏互斥条件:尽量使资源变为可共享,但这在很多情况下不现实,因为某些资源(如打印机)本质上就是不可共享的。
2、破坏请求与保持条件:

  • 静态分配:要求进程在开始执行前一次性申请所有需要的资源,避免在执行过程中再请求额外资源。
  • 动态分配:进程只在真正需要资源时才请求,且请求时必须不持有任何资源。

3、破坏不可剥夺条件:允许操作系统在必要时强行剥夺某个进程已占有的资源,并分配给其他需要的进程,但这可能导致进程状态不一致或数据丢失的问题。
4、破坏循环等待条件:对资源进行排序和分配时实施某种策略,例如为资源分配全局唯一的顺序编号,要求每个进程必须按照编号递增的顺序请求资源,这样可以避免形成循环等待的环路。

介绍下数据库的ioin(内连接,外连接,全连接),内连接和外连接(左,右连接)的区别 

内连接(INNER JOIN)
内连接是最基本的连接类型,它返回两个表中满足连接条件的所有匹配行。换句话说,只有当两个表中指定的列(连接键)的值相等时,这些行才会出现在结果集中。内连接可以理解为取两个表的交集。

外连接(OUTER JOIN)
外连接不仅返回两个表中满足连接条件的行,还返回不满足连接条件的行,但这些行会根据外连接的类型用NULL值填充缺失的部分。

左外连接(LEFT OUTER JOIN / LEFT JOIN)
左外连接以左表为主表,返回左表的所有记录,即使在右表中没有匹配的记录。对于右表中没有匹配的行,结果集中右表的部分会被填充为NULL。

右外连接(RIGHT OUTER JOIN / RIGHT JOIN)
右外连接则相反,以右表为主表,返回右表的所有记录,即使左表中没有匹配的记录。此时,左表中没有匹配的行在结果集中会用NULL填充。

全外连接(FULL OUTER JOIN)
全外连接返回左表和右表中的所有记录。如果某一边没有匹配的记录,则另一边的相应字段会被填充为NULL。这意味着,结果集中会包含左表的所有记录,加上右表的所有记录,两边不匹配的地方使用NULL填充。

内连接与外连接的区别

  • 数据范围:内连接只展示两个表中匹配的记录,而外连接会展示匹配的记录以及至少一侧表中不匹配的记录。
  • NULL处理:外连接会在结果集中为不匹配的记录添加NULL值,而内连接的结果集中不会出现由于不匹配而导致的NULL填充行。
  • 应用场景:内连接常用于需要精确匹配数据的场景,而外连接更适合于需要查看某一边所有数据,同时又能看到匹配数据的场景,尤其适用于统计分析和报表制作中。

MySQL的join过程 

1、解析查询: MySQL首先解析JOIN语句,理解JOIN的条件和参与JOIN的表。
2、选择连接类型: 根据表的数据量、可用索引以及JOIN条件,MySQL会选择合适的JOIN算法。常见的算法包括:
 1) Simple Nested-Loop Join: 最基础的方法,对于每个表A的行,遍历表B的所有行以寻找匹配项。效率低下,特别是在大数据集上。
 2) Index Nested-Loop Join (NLJ): 利用索引来加速JOIN过程。MySQL会先通过索引快速定位到可能匹配的行,减少遍历次数。
 3) Block Nested-Loop Join (BNLJ): 一种优化的NLJ形式,通过缓存块来减少磁盘I/O,提高效率。
 4) Sort-Merge Join: 对参与JOIN的表进行排序,然后合并排序后的结果来找到匹配项。适用于没有合适索引的情况,但需要额外的排序开销。
3、执行JOIN: 根据选择的算法执行JOIN操作。例如,如果使用Index NLJ,MySQL可能首先扫描较小的表或具有更多限制条件的表(驱动表),然后利用索引来查找第二个表(被驱动表)中的匹配行。
4、处理连接类型:

  • INNER JOIN: 只保留两个表中匹配的行。
  • LEFT/RIGHT JOIN: 除了匹配行,还会包括左/右边表中没有匹配的所有行,并在缺失的列上填充NULL。
  • FULL OUTER JOIN: 包含两边没有匹配的所有行,两边均可能有NULL填充。

5、结果排序与限制: 如果查询中有ORDER BY或LIMIT子句,MySQL会对JOIN后的结果集进行相应的排序或限制行数。
6、返回结果: 最后,MySQL将处理后的结果集返回给客户端。
值得注意的是,MySQL的优化器会尝试预测哪种JOIN算法最有效,并选择最优方案。实际的JOIN过程可能涉及多种算法的组合,以及利用临时表和内存中的数据结构来加速处理。此外,索引的优化、统计信息的准确性以及系统的硬件配置都会显著影响JOIN的性能。

MySQL有哪些存储引擎? 

1. InnoDB
简介:InnoDB是MySQL的默认存储引擎(从MySQL 5.5版本开始),提供了高可靠性和高性能的事务存储引擎。它支持事务处理(ACID特性)、行级锁定和外键约束。
特性:

  • 事务支持:提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。
  • 行级锁定:提高了并发访问性能,特别是在多用户同时更新同一表的不同行时。
  • 外键约束:支持外键约束,确保数据的完整性和正确性。
  • 崩溃恢复:内置崩溃恢复机制,能够在数据库宕机或系统崩溃后恢复数据。
  • 聚簇索引:采用聚簇索引,数据行和相邻的键值索引存储在一起,优化了点查询和范围查询的性能。
  • 全文索引:从MySQL 5.6.4版本开始支持全文索引。

2. MyISAM
简介:MyISAM是MySQL早期的默认存储引擎,虽然在MySQL 5.5版本后被InnoDB取代,但在某些特定场景下仍然有其应用价值。
特性:

  • 访问速度快:对于只读或大量读取的应用,MyISAM通常提供较快的查询性能。
  • 全文索引:支持全文索引,适合全文搜索的应用场景。
  • 表级锁定:仅支持表级锁定,不支持行级锁定,因此在高并发写入场景下性能较低。
  • 文件结构:数据和索引分开存储在.MYD和.MYI文件中,表结构保存在.frm文件中。

3. MEMORY
简介:MEMORY存储引擎将数据存储在内存中,因此提供了非常快的访问速度。但是,由于数据存储在内存中,数据容量受到内存大小的限制,并且当数据库服务器重启时,数据会丢失。
特性:

  • 内存存储:数据全部存储在内存中,适合临时表或经常需要进行全表扫描的小型表。
  • 表级锁定:支持的锁粒度为表级锁,在访问量比较大时可能成为瓶颈。
  • 不支持事务:MEMORY存储引擎不支持事务处理。

4. 其他存储引擎
除了上述三种常见的存储引擎外,MySQL还支持其他多种存储引擎,如Archive、Federate、CSV、BLACKHOLE等,每种引擎都有其特定的应用场景和限制。

  • Archive:适用于存储大量归档数据,如日志记录,仅支持INSERT和SELECT操作,不支持索引。
  • Federate:允许连接到远程MySQL服务器并执行查询,适用于分布式数据库系统。
  • CSV:将数据存储在CSV格式的文本文件中,适用于需要与其他系统进行数据交换的场景。
  • BLACKHOLE:虚拟引擎,不会存储任何数据,任何写操作都会被忽略,而任何读操作都会返回空结果集,通常用于临时禁止对数据库的应用程序输入。

引用:https://www.nowcoder.com/discuss/353159520220291072

通义千问、文心一言


http://www.niftyadmin.cn/n/5537348.html

相关文章

千益畅行,旅游卡,如何赚钱?

​ 赚钱这件事情,只有自己努力执行才会有结果。生活中没有幸运二字,每个光鲜亮丽的背后,都是不为人知的付出! #旅游卡服务#

自定义一个背景图片的高度,随着容器高度的变化而变化,小于图片的高度时裁剪,大于时拉伸100%展示

1、通过js创建<image?>标签来获取背景图片的宽高比&#xff1b; 2、当元素的高度大于原有比例计算出来的高度时&#xff0c;背景图片的高度拉伸自适应100%&#xff0c;否则高度为auto&#xff0c;会自动被裁减 3、背景图片容器高度变化时&#xff0c;自动计算背景图片的…

Arduino - 74HC595 4 位 7 段显示器

Arduino - 74HC595 4 位 7 段显示器 Arduino - 74HC595 4-Digit 7-Segment Display) A standard 4-digit 7-segment display is needed for clock, timer and counter projects, but it usually requires 12 connections. The 74HC595 module makes it easier by only requir…

SpringBoot项目,配置文件pom.xml的结构解析

pom.xml 是 Maven 项目对象模型&#xff08;Project Object Model&#xff09;的配置文件&#xff0c;它定义了 Maven 项目的基本设置和构建过程。以下是 pom.xml 文件的基本结构和一些常见元素的解析&#xff1a; 项目声明 (<project>): <modelVersion>: 通常设置…

python OpenCV 库中的 cv2.Canny() 函数来对图像进行边缘检测,并显示检测到的边缘特征

import cv2# 加载图像 image cv2.imread(4.png)# 使用 Canny 边缘检测算法提取边缘特征 edges cv2.Canny(image, 100, 200)# 显示边缘特征 cv2.imshow(Edges, edges) cv2.waitKey(0) cv2.destroyAllWindows() 代码解析&#xff1a; 导入 OpenCV 库&#xff1a; import cv2加…

#商铺出租数据#2024年6月北上广深成渝对比情况

#商铺出租数据#2024年6月北上广深成渝对比情况&#xff1a; 根据某8平台不完全样本统计&#xff0c;北上广深成渝商铺每平米月租金从高到低依次为 北京218.7元、上海212.1元、深圳159.3元、广州145.8元、成都138.6元、重庆104.1元。 地区 区县 日期 类型 数值 上海 全城 202…

创新引领,构筑产业新高地

在数字经济的浪潮中&#xff0c;成都树莓集团以创新驱动为核心&#xff0c;通过整合行业资源、优化服务、培养数字产业人才等措施&#xff0c;致力于打造产业高地&#xff0c;推动地方经济的高质量发展。 一、创新驱动&#xff0c;引领产业发展 1、引入新技术、新模式&#xf…

CISAW证书考完有什么用?值得投资吗?

CISAW证书&#xff0c;在信息安全领域内被公认为具有高价值的一种职业资格认证&#xff0c;它象征着持有者在该领域的专业技能和知识水平。 因此&#xff0c;CISAW证书不仅具有实质性的价值&#xff0c;还能为持有者带来诸多益处。 首先&#xff0c;拥有CISAW证书的专业人士更…