当前位置: 首页 > news >正文

【八股战神篇】MySQL高频面试题

目录

专栏简介

一 什么是索引

延伸

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

2 MySQL 索引分类有哪些?

3 什么字段适合创建索引?

4 索引失效的场景

5 什么是最左匹配原则?

二 为什么 InnoDB 存储引擎选用 B+ 树而不是 B 树呢?

延伸

1 B+树的分裂过程可以简单介绍一下吗?

2 B+树、B树和红黑树的特点及区别?

三 事务的隔离级别

延伸

1 事务的四大特性介绍一下?

2 什么是脏读、幻读、不可重复读

3 MVCC了解吗

四 慢查询优化

延伸

1 慢查询优化解决方案

五 Redo Log、Undo Log、Bin Log三种日志

延伸

1 redo log 和 bin log有什么区别?

2 有了 bin log,为啥还需要 redo log?


专栏简介

八股战神篇专栏是基于各平台共上千篇面经,上万道面试题,进行综合排序提炼出排序前百的高频面试题,并对这些高频八股进行关联分析,将每个高频面试题可能进行延伸的题目再次进行排序选出高频延伸八股题。面试官都是以点破面从一个面试题不断深入,目的是测试你的理解程度。本专栏将解决你的痛点,助你从容面对。本专栏已更新Java基础高频面试题、Java集合高频面试题、MySQL高频面试题,后续会更新JUC、JVM、Redis、操作系统、计算机网络、设计模式、场景题等,计划在七月前更新完毕(赶在大家高频面试前)点此链接订阅专栏“八股战神篇”。

一 什么是索引

索引(Index)是一种用于加速数据库查询操作的数据结构,它的核心作用是提升查询的速度。从本质上来说,索引的作用就是帮助快速定位有序双向链表中的元素,从而减少数据扫描的范围,提高查询效率。接下来,我会详细讲述索引的基本概念和原理。

第一个是索引的基本概念

索引是数据库中一种独特的数据结构,它并不直接存储表中的数据,而是通过创建一个新的数据结构来指向数据表中的具体记录。可以把它类比为字典的目录:当我们查字典时,首先会根据单词的起始字母找到目录页,然后通过目录页中的页码快速定位到具体的单词位置。在这个过程中,目录页就相当于索引表,而目录项就是索引本身。

然而,索引比字典目录更加复杂,因为数据库需要处理动态的数据操作,比如插入、删除和更新等操作。这些操作会导致索引发生变化,因此数据库需要维护索引的一致性和高效性。

第二个是索引的原理

当你在MySQL中创建一个索引时, 首先,MySQL会选择一种数据结构来存储索引,最常见的结构是B+树。B+树是一种自平衡的树形结构,叶子节点存储所有数据,而非叶子节点存储索引信息。它的每个节点包含多个键值对,每个键值对指向一个数据块。 然后,索引会根据数据列的值进行排序,将相应的数据行指向叶子节点。

当你执行一个查询时, 首先,MySQL会利用索引的树结构,根据查询条件快速定位到数据的范围,而无需扫描全表。通过从根节点开始,逐层向下遍历B+树,最终可以找到符合条件的数据。 其次,如果索引指向的列已经包含查询条件,MySQL可以直接从索引中获取数据,避免了全表扫描,提高了查询速度。 最后,如果查询条件涉及多个列,MySQL会使用复合索引来进一步提高查找效率,通过联合多个列的索引来加速多条件查询。

延伸

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

数据库中索引的底层通常使用 B+树哈希表 作为数据结构:

  • B+树:大多数关系型数据库(如 MySQL 的 InnoDB 存储引擎)使用 B+树实现索引,适合范围查询、有序查询。

  • 哈希表:一些特定场景下会使用哈希表索引(如 Memory 引擎中的哈希索引),适合等值查询。

B+树是索引的主要实现方式,因为它支持范围查询、排序以及多种复杂操作,而哈希索引更适合简单的键值匹配。

B+树和哈希表的对比

特性B+树索引哈希索引
查询方式支持范围查询、等值查询仅支持等值查询
排序支持支持排序不支持
范围查询支持支持不支持
性能查询性能稳定,O(log N)查询性能极高,接近 O(1)
适用场景复杂查询、范围查询、排序简单键值匹配,高速查找
应用MySQL InnoDB 主流索引Redis、Memory 引擎等

示例:MySQL 中索引的使用

创建 B+树索引

CREATE INDEX idx_name ON users(name);

创建哈希索引(Memory 引擎)

CREATE TABLE cache_data (id INT,value VARCHAR(255),PRIMARY KEY (id)
) ENGINE = MEMORY;

使用全文索引

CREATE FULLTEXT INDEX idx_content ON articles(content);

2 MySQL 索引分类有哪些?

MySQL 中索引根据功能和用途可以分为以下几类:

  • 主键索引(Primary Key Index):唯一标识表中的每一行,字段值必须唯一且不能为空。

  • 唯一索引(Unique Index):保证字段值的唯一性,但允许为空值。

  • 普通索引(Index):没有唯一性要求的基础索引,用于加速查询。

  • 复合索引(Composite Index):由多个列组成的索引,用于优化多条件查询。

  • 全文索引(Fulltext Index):用于高效搜索文本中的关键词。

  • 空间索引(Spatial Index):用于存储和查询地理空间数据,适用于 Geometry 类型字段。

这些索引类型有不同的特性,适用于不同的查询场景。

索引类型对比

索引类型特点适用场景
主键索引数据唯一且不能为空;InnoDB 中是聚簇索引数据唯一标识的字段,如 ID 字段
唯一索引数据唯一,但可为空邮箱、用户名等需要唯一性的字段
普通索引基本索引,无唯一性要求加速查询,但无需唯一性约束的字段
复合索引多列联合的索引,遵循最左前缀原则多条件联合查询,如 (name, email)
全文索引基于关键词匹配的文本搜索索引快速匹配大文本字段,如博客文章、评论
空间索引用于地理空间数据的索引存储和查询地理位置信息

3 什么字段适合创建索引?

适合创建索引的字段通常具有以下特点:

  • 查询频繁:经常在 WHEREJOIN 或排序(ORDER BY)条件中使用的字段。

  • 唯一性较高:值的区分度高,比如身份证号、邮箱等,不适合在重复率高的字段(如性别)上创建索引。

  • 经常作为排序和分组依据:在 ORDER BYGROUP BY 中出现的字段。

  • 范围查询的字段:如 BETWEEN> < 操作中的字段。

  • 数据量较大的表:小表通常无需索引,因为全表扫描性能足够高。

4 索引失效的场景

索引失效的场景是指在数据库查询中,虽然我们为某些字段建立了索引,但由于某些原因,查询时索引未能被使用,导致查询性能下降。接下来我会详细讲述常见的七个索引失效场景及其原因。

第一个是,当查询条件中使用了函数或表达式操作时,索引会失效。例如,在查询中对索引列使用了 UPPER()、LOWER() 或其他函数操作,数据库无法直接利用索引,因为索引存储的是原始值,而不是经过函数处理后的值。类似的,如果在索引列上进行数学运算(如 age + 1),也会导致索引失效。

第二个是,当查询条件中使用了类型隐式转换时,索引会失效。例如,如果索引列是字符串类型,而查询条件中传入的是数字类型,数据库会尝试将字符串列转换为数字进行比较,这种隐式转换会导致索引失效。正确的做法是确保查询条件的数据类型与索引列的数据类型一致。

第三个是,当查询条件中使用了 LIKE 并以通配符 % 开头时,索引会失效。例如,LIKE '%abc' 这种查询方式会让数据库无法利用索引,因为通配符 % 在开头意味着需要扫描整个表来匹配数据。而如果通配符出现在末尾,如 LIKE 'abc%',索引仍然可以生效。

第四个是,当查询条件中使用了 OR 且部分条件未命中索引时,索引可能失效。例如,如果查询条件是 WHERE indexed_column = 'value1' OR non_indexed_column = 'value2',即使 indexed_column 上有索引,但由于 non_indexed_column 没有索引,数据库可能会选择全表扫描,从而导致索引失效。

第五个是,当查询中使用了 NOT 或 != 操作符时,索引可能会失效。例如,WHERE column != 'value' 或 WHERE NOT column = 'value' 这样的查询条件通常会导致数据库放弃使用索引,因为这类操作需要扫描大量数据来排除不符合条件的记录。

第六个是,当查询中使用了复合索引但未遵循最左前缀原则时,索引会失效。例如,假设有一个复合索引 (A, B, C),如果查询条件只包含 B 或 C,而没有包含 A,那么这个复合索引将无法被使用。只有从最左边的列开始,并按顺序使用索引列,才能有效利用复合索引。

第七个是,当查询中使用了 IS NOT NULL 时,索引可能会失效。虽然 MySQL 支持对 IS NULL 使用索引,但在很多情况下,特别是 IS NOT NULL 的查询,数据库可能会选择全表扫描,从而导致索引失效。

5 什么是最左匹配原则?

最左匹配原则是数据库中使用复合索引(联合索引)时的一个重要规则。它指的是:在查询条件中,必须按照复合索引中字段的顺序,从最左边的字段开始使用,才能充分利用索引。如果跳过了某个字段,则后续字段无法使用索引。

最左前缀原则主要适用于联合索引。联合索引由多个字段组成,例如 (A, B, C)。 索引可以支持以下查询: – WHERE A = ?WHERE A = ? AND B = ?WHERE A = ? AND B = ? AND C = ?

但以下查询无法完全利用索引: – WHERE B = ? AND C = ? (跳过了 A) – WHERE C = ? (跳过了 AB

二 为什么 InnoDB 存储引擎选用 B+ 树而不是 B 树呢?

InnoDB 存储引擎选用 B+树 而非 B树,主要是因为 B+树在数据库场景中具有以下优势:

  1. 叶子节点链表结构便于范围查询:B+树的叶子节点通过双向链表连接,可以方便地进行范围查询(如 BETWEEN> 操作)。

  2. 更高的磁盘读写效率:B+树的非叶子节点只存储键值,而不存储实际数据,因此单个节点可以容纳更多的键值,树的高度更低,减少磁盘 I/O。

  3. 便于扫描和排序:B+树的所有数据都存储在叶子节点中,天然有序,支持高效的全表扫描和排序操作。

相比之下,B树的非叶子节点也存储数据,这会导致节点存储能力变小,树的高度增加,从而增加磁盘 I/O,降低性能。

B树与 B+树的结构对比

  • B树:

    • 每个节点存储键值和实际数据。

    • 数据既存在叶子节点,也存在非叶子节点。

    • 各节点之间无链表连接。

  • B+树:

    • 非叶子节点只存储键值,用于索引定位,不存储实际数据。

    • 数据仅存储在叶子节点中。

    • 所有叶子节点通过链表连接,便于顺序访问。

示意图

  • B树:

      [10 | data]      [30 | data]/      \         /      \
    [5 | data] [15 | data]  [25 | data] [35 | data]

  • B+树:

       [10]          [30]/    \        /    \
    [5]--->[15]--->[25]--->[35]

总结:B+树对比 B树的优势

特性B树B+树
非叶子节点存储键值和数据仅存储键值
叶子节点存储部分键值和数据存储所有键值和数据
数据存储位置分散在叶子和非叶子节点中全部存储在叶子节点
磁盘 I/O节点存储能力较低,树高较大,I/O 次数更多节点存储能力更高,树高较低,I/O 次数更少
范围查询和排序不支持顺序访问支持链表顺序访问,便于范围查询和排序
全表扫描需要逐节点访问只需遍历叶子节点,性能更高

延伸

1 B+树的分裂过程可以简单介绍一下吗?

B+树 中,分裂是为了保持树的平衡性。当节点因插入新数据而超出其容量时,会触发分裂操作。分裂的过程如下:

  • 找到要插入的节点:如果插入数据导致当前节点的键值数量超出最大容量,则该节点需要分裂。

  • 分裂节点

    :将节点的键值分为两部分:

    • 左半部分留在原节点;

    • 中间的键值上移到父节点,作为分裂的新分界点;

    • 右半部分被移动到一个新节点中。

  • 调整父节点:将中间键值插入到父节点。如果父节点也超出容量,则递归进行分裂。

  • 调整树高度:当根节点也需要分裂时,会生成一个新的根节点,树的高度增加。

通过分裂操作,B+树始终保持平衡,每次插入的时间复杂度为 (O(\log N))。

2 B+树、B树和红黑树的特点及区别?

B+树、B树和红黑树是常见的平衡树数据结构,尤其在数据库、文件系统和内存中应用的十分广泛。接下来,我将从六个方面详细讲解这三者的特点和区别。

第一个方面是数据存储位置。B+树将所有数据存储在叶子节点,非叶子节点只存储索引键;B树则将数据存储在叶子节点和非叶子节点中,所有节点都存储数据;而红黑树则在每个节点中都存储数据。

第二个方面是索引查找效率。B+树的查找操作最终都在叶子节点完成,查找路径统一,效率较高;B树的查找操作可能在非叶子节点完成,查找路径不统一,效率稍低;红黑树的查找路径统一,时间复杂度为O(log n),每次操作通过旋转和重新染色来保持平衡。

第三个方面是树的高度。B+树由于扇出较高(每个节点存储多个键),树的高度通常较低,查询效率较高;B树由于非叶子节点也存储数据,扇出较小,树的高度较高;红黑树作为二叉查找树,树的高度较高,每个节点最多有两个子节点,树的深度较大。

第四个方面是磁盘I/O效率。B+树由于非叶子节点只存储索引,扇出高,可以减少磁盘访问次数,因此磁盘I/O效率非常优秀;B树稍逊于B+树,因为非叶子节点也存储数据,导致扇出较小,磁盘访问次数略多;红黑树的磁盘I/O效率较差,因为树的高度较高,每次查找可能需要频繁访问磁盘。

第五个方面是适用场景。B+树常用于数据库索引、文件系统索引,适合大规模数据的存储和检索,尤其在需要高效范围查询时;B树适用于数据库索引和文件系统索引,但相比B+树,查找效率稍低;红黑树适用于内存中的数据结构,如Java中的TreeMap和TreeSet,适合存储符号表、集合、关联数组等内存数据。

第六个方面是空间利用率。B+树的空间利用率较高,非叶子节点只存储索引,存储效率较好;B树的空间利用率较低,非叶子节点存储数据和索引,存储效率较低;红黑树的空间利用率较高,所有节点都存储数据,且由于树的平衡性,内存利用效率较好。

三 事务的隔离级别

事务的隔离级别是数据库管理系统(DBMS)中用于控制事务并发执行时的数据一致性和并发控制的一种机制。不同的隔离级别决定了事务在执行过程中对其他事务的可见性,从而影响了数据的完整性和查询的准确性。接下来我将详细讲述四种隔离级别。

第一种是读取未提交(READ UNCOMMITTED),在这个隔离级别下,事务可以读取其他事务尚未提交的数据,可能会发生脏读、不可重复读、幻读。当你在执行一个查询时,如果一个事务正在修改数据,但尚未提交,其他事务仍然可以看到这个未提交的数据。这虽然提供了最高的并发性,但也带来了数据一致性的风险,比如读取到不一致的数据。

第二种是读取已提交(READ COMMITTED),在这个隔离级别下,事务只能读取其他事务已提交的数据,可能会发生不可重复读、幻读。当你在执行一个查询时,只有那些已经提交的事务对当前事务可见。然而,不可重复读问题依然存在:如果在同一个事务中多次查询相同的数据,可能会得到不同的结果,因为其他事务可能在查询间修改了数据。

第三种是可重复读(REPEATABLE READ),在这个隔离级别下,事务在执行期间会锁定查询的数据行,确保该数据在事务完成前不会被其他事务修改。当你在执行一个查询时,同一事务中的查询结果不会变化,即使其他事务修改了数据,当前事务也看不到变化的数据。然而,这个级别仍然存在幻读问题,即在查询过程中,其他事务可能会插入新的数据行,导致当前事务查询的数据集发生变化。

第四种是可串行化(SERIALIZABLE),在这个隔离级别下,事务的执行会像是串行执行的,即一个事务执行完成后,另一个事务才能开始。当你在执行一个查询时,不仅当前查询的数据不会被修改,其他事务也不能插入新的数据行。这个级别提供了最高的数据一致性,但代价是性能的显著下降,因为它限制了并发操作。

性能对比

隔离级别并发性能数据一致性
READ UNCOMMITTED最高最低(可能脏读)
READ COMMITTED较高防止脏读
REPEATABLE READ较低防止脏读和不可重复读
SERIALIZABLE最低完全一致

延伸

1 事务的四大特性介绍一下?

事务的四大特性(ACID)分别是(有的面试官可能会问英文是什么建议记一下):

  • 原子性(Atomicity):事务是一个不可分割的整体,要么全部执行成功,要么全部失败回滚。

  • 一致性(Consistency):事务执行前后,数据库必须保持一致状态,不会破坏数据的完整性。

  • 隔离性(Isolation):多个事务并发执行时,事务之间互不干扰,保证中间状态对其他事务不可见。

  • 持久性(Durability):事务一旦提交,其对数据库的修改是永久的,即使系统崩溃也能恢复。

详解

  1. 原子性(Atomicity)

  • 原子性意味着事务是一个不可分割的整体。事务中的所有操作要么全部完成,要么全部回滚撤销,不能只执行一部分。

  • 实现原理:

    • 通过事务日志实现,如果事务未成功完成,则通过日志回滚到事务开始前的状态。

  • 例子:

    在银行转账中,如果从账户 A 扣款成功,但账户 B 加款失败,则整个转账操作需要回滚,保证事务的原子性。

    START TRANSACTION;
    UPDATE Accounts SET balance = balance - 100 WHERE id = 1;  -- 从账户 A 扣款
    UPDATE Accounts SET balance = balance + 100 WHERE id = 2;  -- 向账户 B 加款
    COMMIT;  -- 如果两步操作都成功,提交事务

  1. 一致性(Consistency)

  • 一致性保证事务执行前后,数据库状态必须保持一致,符合数据库的完整性约束(如主键约束、外键约束等)。

  • 实现原理:

    • 数据库会通过约束条件和事务回滚机制,确保在事务执行失败时数据不会被破坏。

  • 例子:

    转账操作前后,账户 A 和账户 B 的总金额应保持不变:

    • 转账前:A 的余额 1000 元,B 的余额 500 元,总和 1500 元。

    • 转账后:A 的余额 900 元,B 的余额 600 元,总和仍为 1500 元。

  1. 隔离性(Isolation)

  • 隔离性保证多个事务并发执行时,事务之间的操作互不干扰,一个事务的中间状态对其他事务不可见。

  • 实现原理:

    • 通过锁机制(行锁、表锁等)和隔离级别(如 REPEATABLE READ)来实现事务隔离。

  • 隔离性问题:

    • 脏读:读取到其他未提交事务的修改。

    • 不可重复读:同一事务中多次读取结果不一致。

    • 幻读:同一事务中,前后查询的结果集记录数不一致。

  • 例子: 一个事务正在修改账户余额,在事务提交前,其他事务不能读取到未提交的数据。

  1. 持久性(Durability)

  • 持久性保证事务一旦提交,其对数据库的修改是永久性的,即使系统崩溃也不会丢失。

  • 实现原理:

    • 数据库通过事务日志(如 redo log)记录所有修改操作,并在崩溃后通过日志进行恢复。

  • 例子: 转账事务完成后,即使系统重启,账户 A 和账户 B 的余额修改仍然有效,不会丢失。


事务特性总结表

特性描述实现机制示例
原子性事务中的操作不可分割,要么全部完成,要么全部回滚。事务日志(undo log)转账中 A 扣款成功但 B 加款失败时回滚。
一致性事务前后,数据库必须从一个一致状态转到另一个一致状态。约束检查 + 回滚转账前后账户余额总和保持一致。
隔离性并发事务之间互不干扰,中间状态对其他事务不可见。锁机制 + 隔离级别一个事务修改数据时,另一个事务无法读取。
持久性事务提交后,修改永久生效,系统崩溃后也能恢复。事务日志(redo log)转账完成后,数据写入磁盘即永久有效。

2 什么是脏读、幻读、不可重复读

脏读是指一个事务读取到了另一个事务尚未提交的数据。如果后续该事务回滚了未提交的修改,则第一个事务读取到的数据就是无效的,从而导致数据的不一致性。脏读是事务隔离性问题之一。它发生在两个事务并发执行时,一个事务读取到了另一个事务未提交的数据,而这些未提交的数据可能被回滚,因此读取的内容可能是错误或无效的。

幻读是指在一个事务中执行两次相同的查询时,结果集的行数不同。通常是因为另一个事务在两次查询之间插入或删除了满足查询条件的数据行,从而导致查询结果的不一致。幻读是事务隔离性问题之一。幻读主要发生在 多行操作 中,例如范围查询一个事务第一次查询时获取了满足条件的记录。另一个事务在其间插入或删除了符合条件的记录。 当第一个事务再次查询时,结果集行数发生了变化,产生“幻影”记录,这就是幻读。

不可重复读是指在一个事务中多次读取同一条记录时,结果不一致,通常是因为在两次读取之间,另一事务修改了该记录的数据(包括更新或删除操作)。不可重复读是事务隔离性问题之一。不可重复读的关键在于,事务中读取到的数据在操作期间被其他事务修改了,导致数据前后不一致。主要表现第一次读取获得的结果和第二次读取的结果不同。修改可以是更新现有数据或删除数据。

3 MVCC了解吗

MVCC(多版本并发控制)是一种数据库管理系统通过维护数据的历史版本来实现高并发读写场景下数据一致性的关键技术。其核心思想在于允许读取操作不阻塞写入操作,同时写入操作也不会阻塞读取操作,以此在保证事务隔离性的前提下最大限度地提升并发性能。

在MySQL的InnoDB引擎中,MVCC通过为每一行数据隐式添加两个系统版本号字段来实现分别是创建版本号(记录数据插入或修改时的事务ID)和删除/过期版本号(记录数据删除或更新时的事务ID)。每个事务启动时会生成一个唯一的系统版本号作为事务ID,并通过“快照视图”(Read View)决定当前事务能观察到哪些版本的数据。

MVCC的实现依赖于版本链Undo日志。当数据被修改时,旧版本数据会存入Undo日志,并形成以版本号为顺序的链表结构。读操作通过遍历版本链选择对当前事务可见的版本。例如,更新操作(UPDATE)会将原始行标记为删除(记录当前事务ID为删除版本号),并插入新行(记录当前事务ID为创建版本号),从而形成可追溯的版本历史。

四 慢查询优化

慢查询优化总体上通过三个步骤来进行,先捕获低效SQL,然后使用工具进行分析,最后采用一些方法进行优化,

首先,是捕获低效SQL,我们需要确保慢查询日志已启用。通过设置全局变量slow_query_log为'ON'来开启此功能,并设定long_query_time参数以确定什么程度的查询延迟被视为“慢”。

接下来,我们要分析慢查询日志,这是找出问题根源的关键步骤。利用工具如mysqldumpslow可以帮助我们总结日志信息,比如按出现频率或总执行时间排序,从而聚焦于最需要关注的查询语句。

对于每一个慢查询,我们可以使用EXPLAIN命令查看MySQL如何执行这些查询。EXPLAIN提供的输出能够揭示查询执行计划中的细节,例如是否进行了全表扫描(ALL),以及哪些索引被使用等。根据这些信息,我们可以做出更明智的决策来优化查询性能。

后是,采用一些方法进行优化,常用的优化策略如下:

  1. 创建合理的索引:对频繁查询的字段(如 WHEREJOINORDER BYGROUP BY 字段)创建索引。

  2. 优化 SQL 语句:简化查询逻辑,减少嵌套查询或子查询。

  3. 分区或分表:对于数据量较大的表,考虑分区或分表。

  4. 缓存机制:使用数据库缓存或应用层缓存减少重复查询。

延伸

1 慢查询优化解决方案

1.慢查询的解决方案

解决MySQL慢查询问题的方案可以按照资源消耗从少到多的顺序排列,像金字塔一样逐步提升。以下是从资源消耗少到多的常见优化方式:

(1)SQL优化

合理使用索引:确保查询字段使用了索引。对于WHERE、JOIN、ORDER BY、GROUP BY等操作的字段,应该创建相应的索引。

(2)索引优化

创建复合索引:对于多个字段联合查询,创建复合索引(注意索引顺序)。

删除冗余索引:定期清理无用索引,减少索引维护的负担。

避免索引覆盖不必要的字段:有时候一个大字段(如TEXT或BLOB)放入索引会增加存储开销,应该避免。

更新统计信息:定期更新表的统计信息,帮助优化器选择更合适的执行计划。

(3)数据库配置优化

调整缓存设置:增加innodb_buffer_pool_size,确保更多的数据能够缓存到内存中。调整query_cache_size,如果适用,启用查询缓存(对于更新频繁的应用不推荐)。

调整连接设置:如增加max_connections,但要注意数据库承载能力。

调整临时表大小:如果临时表经常写入磁盘,可以通过调整tmp_table_size和max_heap_table_size来避免此问题。

增加排序缓存:增加sort_buffer_size来提高ORDER BY和GROUP BY操作的效率。

(4)架构优化

分库分表:对于单表数据量过大的情况,使用分库分表策略,将数据分散到不同的数据库或表中,减少每个查询的负载。

读写分离:通过主从复制,减少主库的查询压力,读请求分发到从库。

数据库集群:使用分布式数据库系统,解决单机性能瓶颈。

(5)硬件升级

增加内存:通过增加内存,提高缓存命中率,减少磁盘IO。

更换更快的磁盘:使用SSD代替传统的硬盘,提升磁盘IO性能。

增加CPU处理能力:提升CPU性能,减少数据库查询的CPU瓶颈。

五 Redo Log、Undo Log、Bin Log三种日志

Redo Log 是 MySQL 中 InnoDB 存储引擎使用的一种持久化日志,用于记录事务对数据的修改,确保数据库的崩溃恢复能力。即使数据库在写入过程中崩溃,Redo Log 也能帮助恢复到事务提交时的状态。

Undo Log 是 MySQL 中 InnoDB 存储引擎使用的一种日志,用于记录数据的撤销操作。其主要作用是支持事务回滚多版本并发控制(MVCC)。当事务操作失败或主动回滚时,Undo Log 可以将数据恢复到事务开始前的状态。

Bin Log(Binary Log) 是 MySQL 的二进制日志,主要用于记录对数据库执行的所有修改操作(如 INSERTUPDATEDELETE)以及可能引起数据变化的语句(如 CREATE TABLEALTER TABLE)。它的主要用途包括:

  • 数据恢复:通过重放 Bin Log 恢复数据到某个时间点。

  • 主从复制:Bin Log 是 MySQL 主从同步的基础,用于将主库的变更同步到从库。

  • 增量备份:通过记录变更操作实现增量备份,减少全量备份的频率。

详解

1,Redo Log 的工作原理

预写日志(Write Ahead Logging) – 当事务修改数据时,先将修改记录写入 Redo Log,并将日志标记为“准备提交”。 – 等日志写入成功后,事务才会真正提交。

示例过程:

  • 修改数据:事务 T1 修改数据,记录写入内存和 Redo Log。

  • 提交事务:事务提交时,先确保 Redo Log 持久化到磁盘。

  • 异常恢复:如果数据库崩溃,InnoDB 使用 Redo Log 恢复已提交的事务。

2,Redo Log 的组成结构

Redo Log 由两部分组成:

  • Redo Log Buffer(内存中的日志缓冲区) – Redo Log 首先写入内存中的缓冲区。 – 当缓冲区满、事务提交或某些时间点触发时,日志会被刷新到磁盘。

  • Redo Log File(磁盘上的日志文件)

    • 持久化到磁盘的日志文件,默认命名为 ib_logfile0ib_logfile1

    • 日志文件采用循环写的方式(有限大小,写满后覆盖旧数据)。

1,Undo Log 的工作原理

数据修改与日志记录 – 当事务修改数据时,InnoDB 不直接覆盖原始数据,而是先将修改前的快照写入 Undo Log。 – Undo Log 保存在回滚段(Rollback Segment)中,与数据表的操作分开存储。

回滚过程 – 如果事务执行失败或被主动回滚,InnoDB 根据 Undo Log 逐条撤销已执行的操作,将数据恢复到事务开始前的状态。

2,Undo Log 的内容结构

逻辑日志 – 记录的是每次修改的逻辑操作,适用于 INSERTUPDATEDELETE 操作。 – 例子: 对某行执行 UPDATE,Undo Log 记录原始行的数据值。 对某行执行 DELETE,Undo Log 记录被删除的整行。

存储方式 Undo Log 存储在专用的 Undo 表空间中(从 MySQL 5.6 开始支持独立 Undo 表空间)。 数据写入表时对应生成 Undo Log,事务提交后,Undo Log 可被清理。

1,Binlog 的类型

MySQL 支持以下三种 Binlog 格式,每种格式的记录方式不同:

  • STATEMENT(语句模式) – 记录每一条修改数据的 SQL 语句。 – 优点:Binlog 文件体积小,写入效率高。 – 缺点:某些场景(如基于函数或用户变量的操作)可能导致不一致。

  • ROW(行模式) – 记录每一行数据的具体变更内容(包括变更前后的值)。 – 优点:更高的一致性,不受函数等操作影响。 – 缺点:Binlog 文件体积较大。

  • MIXED(混合模式) – 根据具体场景在 STATEMENTROW 模式之间切换。 – 优点:结合了两者的优势,避免了一些不一致问题。

切换格式

SET GLOBAL binlog_format = 'ROW';  -- 设置 Binlog 格式为 ROW

2,Bin Log 的结构

  1. 事件类型 Binlog 是以事件为单位存储的,每个事件描述一次操作: – Query Event:记录 DDL 和 DML 语句。 – Table Map Event:记录表的元数据(在 ROW 格式中使用)。 – Write Rows Event:记录行的插入操作。 – Update Rows Event:记录行的更新操作。 – Delete Rows Event:记录行的删除操作。

  1. 文件结构 Binlog 文件以二进制格式存储,文件名通常为 binlog.000001binlog.000002,并通过 binlog.index 文件管理。

3,Bin Log 的使用示例

  • 查看 Binlog 文件列表

SHOW BINARY LOGS;
  • 查看当前正在写入的 Binlog 文件

SHOW MASTER STATUS;
  • 读取 Binlog 文件内容

mysqlbinlog binlog.000001
  • 恢复数据

mysqlbinlog --start-datetime="2025-01-14 10:00:00" 
--stop-datetime="2025-01-14 12:00:00" binlog.000001 | mysql -u root -p

三种日志的对比

日志类型功能记录内容持久化时机
Redo Log保证事务持久性,支持崩溃恢复已提交事务的修改操作事务提交时写入磁盘
Undo Log支持事务回滚和 MVCC 的快照隔离未提交事务前的数据快照修改数据时写入磁盘
Binlog支持主从同步和数据恢复所有更改数据库结构或数据的操作事务提交后写入磁盘

延伸

1 redo log 和 bin log有什么区别?

Redo LogBinlog 是 MySQL 中两种不同的日志类型,它们的功能和作用各有侧重。主要区别如下:

特性Redo LogBinlog
作用保证事务持久性(崩溃恢复)数据恢复(增量恢复)、主从复制
记录内容数据的物理变化(页级别修改)数据的逻辑变化(SQL 或行级别操作)
写入时机在事务执行过程中实时写入在事务提交时写入
持久性用于 InnoDB 引擎内部,写入磁盘后立即可用用于 MySQL 服务器,提交后生成日志
适用范围仅适用于 InnoDB 存储引擎适用于整个 MySQL 实例
日志格式物理日志(记录页的修改)逻辑日志(SQL 语句或行记录)
循环使用有固定大小,循环覆盖使用文件递增存储,不会覆盖
主要用途崩溃恢复主从复制、增量备份、数据恢复

2 有了 bin log,为啥还需要 redo log?

虽然 BinlogRedo Log 都记录了数据的修改,但两者的作用和设计目的不同,不能互相替代。因此,MySQL 同时需要 Redo LogBinlog 来确保性能、事务的持久性和数据一致性。以下是具体原因:

  • Redo Log:解决事务持久性(事务已提交但未刷新到磁盘时,系统崩溃后能恢复)。

  • Binlog:解决增量备份主从复制问题(确保逻辑操作可重复执行)。

相关文章:

【八股战神篇】MySQL高频面试题

目录 专栏简介 一 什么是索引 延伸 1 索引的底层使用的是什么数据结构&#xff1f; 2 MySQL 索引分类有哪些&#xff1f; 3 什么字段适合创建索引&#xff1f; 4 索引失效的场景 5 什么是最左匹配原则&#xff1f; 二 为什么 InnoDB 存储引擎选用 B 树而不是 B 树呢&a…...

服务器防文件上传手写waf

一、waf的目录结构&#xff0c;根据自己目录情况进行修改 二、创建文件夹以及文件 sudo mkdir -p /www/server/waf-monitor sudo mkdir -p /www/server/waf-monitor/quarantine #创建文件夹 chmod 755 /www/server/waf-monitor #赋权cd /www/server/waf-monitor/touch waf-m…...

ElasticSearch-集群

本篇文章依据ElasticSearch权威指南进行实操和记录 1&#xff0c;空集群 即不包含任何节点的集群 集群大多数分为两类&#xff0c;主节点和数据节点 主节点 职责&#xff1a;主节点负责管理集群的状态&#xff0c;例如分配分片、添加和删除节点、监控节点故障等。它们不直接…...

Android开发——原生渲染方案实现 PDF 预览功能

Android开发——原生渲染方案实现 PDF 预览功能 1. 引言2. 原生渲染方案核心设计:从数据到视图3. 混合文档容器:ViewPager2 与适配器设计1. 引言 在移动应用开发中,PDF 预览是文档处理场景的核心需求之一。Android 生态提供了多元化的技术方案,从系统级简版预览到原生渲染…...

Java求职者面试:从Spring Boot到微服务的技术点解析

Java求职者面试&#xff1a;从Spring Boot到微服务的技术点解析 场景&#xff1a;互联网医疗-预约挂号系统 面试官&#xff1a; “小明&#xff0c;我们今天的场景是一个互联网医疗的预约挂号系统。我们需要支持高并发的用户预约操作&#xff0c;同时保证数据一致性和系统的高…...

操作系统听课笔记之进程的概念

引入新的概念,为什么不能叫程序 内存中进程Image实例: stack: 局部变量(函数弹出来没有了) data: 全局变量(共享) 静态变量 heap: malloc分配的内存 从数据结构和算法角度解决问题: 设计相应的数据结构和设计算法 数据结构: 进程PCB 算法:创建进程和进程通信各种操作在线内…...

【基于Spring Boot 的图书购买系统】深度讲解 用户注册的前后端交互,Mapper操作MySQL数据库进行用户持久化

引言 在现代Web应用中&#xff0c;用户注册功能是用户与应用交互的入口。一个高效、安全且用户友好的注册系统不仅能吸引用户&#xff0c;还能为后续功能&#xff08;如个性化服务&#xff09;奠定基础。本博客将通过一个实际案例&#xff0c;展示如何使用HTML、JavaScript、j…...

Spark,连接MySQL数据库,添加数据,读取数据

以下是使用 Spark/SparkSQL 连接 MySQL 数据库、添加数据和读取数据的完整示例&#xff08;需提前准备 MySQL 驱动包&#xff09;&#xff1a; 一、环境准备 1. 下载 MySQL 驱动 - 下载 mysql-connector-java-8.0.33.jar &#xff08;或对应版本&#xff09;&#xff0c;放…...

ubuntu的虚拟机上的网络图标没有了

非正常的关机导致虚拟机连接xshell连接不上&#xff0c;ping也ping不通。网络的图标也没有了。 记录一下解决步骤 1、重启服务 sudo systemctl restart NetworkManager 2、图标显示 sudo nmcli network off sudo nmcli network on 3、sudo dhclient ens33 //(网卡) …...

Linux系统:ext2文件系统的核心概念和结构

本节重点 块、块组、分区的引入块组的构成inode与inode Table路径解析与路径缓存机制目录与文件名在文件系统中的存储分区的初始化与挂载 一、ext2文件系统 1.1 “块”的引入 在前言部分我们说扇区是磁盘硬件的最小读写单位&#xff0c;通常为512字节&#xff0c;但是在操作…...

Python 装饰器详解

装饰器是 Python 中一种强大的语法特性&#xff0c;它允许在不修改原函数代码的情况下动态地扩展函数的功能。装饰器本质上是一个高阶函数&#xff0c;它接受一个函数作为参数并返回一个新的函数。 基本装饰器 1. 简单装饰器示例 def my_decorator(func):def wrapper():prin…...

Docker配置容器开机自启或服务重启后自启

要将一个 Docker 容器设置为开机自启&#xff0c;你可以使用 docker update 命令或配置 Docker 服务来实现。以下是两种常见的方法&#xff1a; 方法 1&#xff1a;使用 docker update 设置容器自动重启 使用 docker update 设置容器为开机自启 你可以使用以下命令&#xff0c…...

20250518 黎曼在三维空间中总结的一维二维的规律,推广到高维度合适吗?有没有人提出反对意见

黎曼在三维空间中总结的一维二维的规律&#xff0c;推广到高维度合适吗&#xff1f;有没有人提出反对意见 黎曼几何在数学物理中的广泛应用&#xff0c;尤其是在广义相对论和高维空间理论中&#xff0c;确实是建立在黎曼在三维空间中的推广基础上的。不过&#xff0c;这种推广…...

使用AI 生成PPT 最佳实践方案对比

文章大纲 一、专业AI生成工具(推荐新手)**1. 推荐工具详解****2. 操作流程优化****3. 优势与局限**二、代码生成方案(开发者推荐)**1. Python-pptx进阶用法****2. GitHub推荐**三、混合工作流(平衡效率与定制)**1. 工具链升级****2. 示例Markdown结构**四、网页转换方案(…...

【Docker】Docker Compose方式搭建分布式协调服务(Zookeeper)集群

开发分布式应用时,往往需要高度可靠的分布式协调,Apache ZooKeeper 致力于开发和维护开源服务器&#xff0c;以实现高度可靠的分布式协调。具体内容见zookeeper官网。现代应用往往使用云原生技术进行搭建,如何用Docker搭建Zookeeper集群,这里介绍使用Docker Compose方式搭建分布…...

R for Data Science(3)

R for Data Science以下是关于网页内容的详细笔记&#xff1a; 1. 章节概览 章节主题&#xff1a;数据转换&#xff08;Data Transformation&#xff09;核心内容&#xff1a;介绍如何使用 R 中的 dplyr 包进行数据转换&#xff0c;包括对数据框的行、列和组的操作&#xff0…...

深入浅出Hadoop:大数据时代的“瑞士军刀”

深入浅出Hadoop&#xff1a;大数据时代的“瑞士军刀” 在当今这个数据爆炸的时代&#xff0c;每天产生的数据量已经远超人类的想象。从社交媒体的互动到电商平台的交易记录&#xff0c;从物联网设备的实时监控到科学研究的实验数据&#xff0c;大数据已经成为推动各行各业变革…...

《Python星球日记》 第94天:走近自动化训练平台

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、自动化训练平台简介1. Kubeflow Pipelines2. TensorFlow Extended (TFX) 二…...

MetaMask安装及使用-使用水龙头获取测试币的坑?

常见的异常有&#xff1a; 1.unable to request drip, please try again later. 2.You must hold at least 1 LINK on Ethereum Mainnet to request native tokens. 3.The address provided does not have sufficient historical activity or balance on the Ethereum Mainne…...

软件架构之--论微服务的开发方法1

论微服务的开发方法1 摘要 2023年 2月,本人所在集团公司承接了长三角地区某省渔船图纸电子化审查系统项目开发,该项目旨在为长三角地区渔船建造设计院、以及渔船图纸审查机构提供一个便捷的渔船图纸电子化审查服务平台。在此项目中,我作为项目组成员参与项目的建设工作,并…...

SOLID 面对象设计的五大基本原则

SOLID 原则的价值 原则核心价值解决的问题SRP职责分离&#xff0c;提高内聚性代码臃肿、牵一发而动全身OCP通过扩展而非修改实现变化频繁修改现有代码导致的风险LSP确保子类行为的一致性继承滥用导致的系统不稳定ISP定制化接口&#xff0c;避免依赖冗余接口过大导致的实现负担…...

游戏引擎学习第293天:移动Familiars

回顾并为今天的内容定下基调 我们正在做一款完整的游戏&#xff0c;今天的重点是“移动模式”的正式化处理。目前虽然移动机制大致能运作&#xff0c;但写法相对粗糙&#xff0c;不够严谨&#xff0c;我们希望将其清理得更规范&#xff0c;更可靠一点。 目前脑逻辑&#xff0…...

《沙尘暴》观影记:当家庭成为人性的修罗场

起初点开《沙尘暴》&#xff0c;不过是想在碎片时间里寻个消遣&#xff0c;毕竟短剧的篇幅显得轻松无负担。未曾想&#xff0c;这看似简短的故事却如一场裹挟着砂砾的风暴&#xff0c;在心底掀起层层涟漪&#xff0c;让我忍不住在家庭教育、人性幽微处反复踱步沉思。 一、风暴眼…...

牛客网NC21989:牛牛学取余

牛客网NC21989:牛牛学取余 &#x1f4dd; 题目描述 ⏱️ 限制条件 时间限制&#xff1a;C/C/Rust/Pascal 1秒&#xff0c;其他语言2秒空间限制&#xff1a;C/C/Rust/Pascal 32 M&#xff0c;其他语言64 M输入范围&#xff1a;两个整数&#xff0c;在int范围内 &#x1f4e5;…...

王者荣耀游戏测试场景题

如何测试一个新英雄&#xff1a;方法论与实践维度 测试一个新英雄不仅仅是“打打打”&#xff0c;而是一套完整的测试流程&#xff0c;包括设计文档验证、功能验证、数值验证、性能验证、交互验证等。可以从以下多个角度展开&#xff1a; &#x1f50d; 1. 方法论维度 ✅ 测试…...

Spring Boot 与 RabbitMQ 的深度集成实践(二)

集成步骤详解 配置 RabbitMQ 连接信息 在 Spring Boot 项目中&#xff0c;通常在application.properties或application.yml文件中配置 RabbitMQ 的连接信息。以application.yml为例&#xff0c;配置如下&#xff1a; spring: rabbitmq: host: localhost port: 5672 usern…...

医疗信息系统安全防护体系的深度构建与理论实践融合

一、医疗数据访问系统的安全挑战与理论基础 1.1 系统架构安全需求分析 在医疗信息系统中&#xff0c;基于身份标识的信息查询功能通常采用分层架构设计&#xff0c;包括表现层、应用层和数据层。根据ISO/IEC 27001信息安全管理体系要求&#xff0c;此类系统需满足数据保密性…...

多模态大语言模型arxiv论文略读(八十)

## MMWorld: Towards Multi-discipline Multi-faceted World Model Evaluation in Videos ➡️ 论文标题&#xff1a;MMWorld: Towards Multi-discipline Multi-faceted World Model Evaluation in Videos ➡️ 论文作者&#xff1a;Xuehai He, Weixi Feng, Kaizhi Zheng, Yuji…...

FFmpeg:多媒体处理的终极利器

FFmpeg详细介绍 1. 定义与基本概述 FFmpeg是一套开源的跨平台多媒体处理工具集,最初由法国程序员Fabrice Bellard于2000年开发,其名称源自“Fast Forward MPEG”,体现了其高效处理MPEG格式的能力。它不仅是命令行工具,还包含多个库和开发套件,支持视频转码、剪辑、合并、…...

【Leetcode】取余/2的幂次方

给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。返回这个结果。 示例 1: 输入: num 38 输出: 2 解释: 各位相加的过程为&#xff1a; 38 --> 3 8 --> 11 11 --> 1 1 --> 2 由于 2 是一位数&#xff0c;所以返回 2。 …...

程序代码篇---ESP32的数据采集

文章目录 前言 前言 本文简单介绍了ESP32可以怎样采集数据。...

系统架构设计(十三):虚拟机体系结构风格

概念 虚拟机&#xff08;Virtual Machine&#xff09;体系结构风格&#xff0c;是指将整个系统抽象为一台“虚拟机”&#xff0c;通过解释或模拟的方式运行应用程序。 它本质上提供了一种“平台中立”的运行环境&#xff0c;典型代表就是 Java 虚拟机&#xff08;JVM&#xf…...

lvs-dr部署

实验准备&#xff1a; 准备4台设备&#xff0c;1台作为客户机&#xff0c;3台作为服务器&#xff0c;服务器中1台作为调度器&#xff0c;2台作为后端真实访问服务器。并关闭所有防火墙与核心防护。 systemctl stop firewalld setenforce 0 实验开始 调度器配置 yum -y ins…...

数据库blog2_数据结构与效率

&#x1f33f;计算机中的数据————存储结构与逻辑结构 &#x1f342;存储结构&#xff08;物理结构&#xff09; 定义&#xff1a;存储结构是指数据在计算机存储器中的实际存储方式&#xff0c;由计算机硬件特性决定。它涉及到数据的物理位置和存储顺序。存储结构直接影响数…...

聊天室项目总结

已实现的功能点&#xff1a; 存在的问题&#xff1a; 1.没有实现有含金量的创新功能点 2.太过于依赖工具&#xff0c;不喜欢自己看文章总结对知其然而不知其所以然&#xff0c;自己的理解比较少&#xff0c;懒于去思考 3.太过于依赖他人&#xff0c;自己的想法有点少&#x…...

数据结构:二叉树一文详解

数据结构:二叉树一文详解 前言一、二叉树的基本概念与结构特性1.1 二叉树的定义1.2 二叉树的特殊类型1.3 二叉树的性质 二、二叉树的遍历方式2.1 前序遍历&#xff08;Pre-order Traversal&#xff09;2.2 中序遍历&#xff08;In-order Traversal&#xff09;2.3 后序遍历&…...

2025年- H28-Lc136- 24.两两交换链表中的节点(链表)---java版

1.题目描述 2.思路 cur指针要先放在虚拟头节点&#xff0c;才能去操作第一个数和第二个数 先判断偶数个节点&#xff0c;再判断奇数个节点&#xff0c;否则会犯空指针异常。 &#xff08;1&#xff09;如果节点是偶数个节点&#xff0c;只要满足curr.nextnull&#xff0c;就说…...

ubuntu18.04通过cuda_11.3_xxx.run安装失败,电脑黑屏解决办法

项目场景&#xff1a; ubuntu18.04跑DG-SLAM相关代码&#xff0c;安装lietorch包报错&#xff0c;需要用到GPU。 问题描述 跑代码需要cuda11.3&#xff0c;系统里面有另外一个版本&#xff0c;运行cuda_11.3_xxx.run&#xff0c;同时也选择了driver&#xff0c;安装成功后&am…...

Linux之基础IO

目录 一、理解 "文件" 1.1、狭义理解 1.2、广义理解 1.3、文件操作的归类认知 1.4、系统角度 二、回顾C语言接口 2.1、打开文件 2.2、写文件 2.3、读文件 2.4、stdin & stdout & stderr 2.6、打开文件的方式 三、系统文件I/O 3.1、一种传递标志…...

上位机知识篇---涂鸦智能云平台

文章目录 前言 前言 本文简单介绍了涂鸦智能云平台。...

InfluxDB 3 Core + Java 11 + Spring Boot:打造高效物联网数据平台

一、 引言&#xff1a;为什么选择InfluxDB 3&#xff1f; 项目背景&#xff1a; 在我们的隧道风机监控系统中&#xff0c;实时数据的采集、存储和高效查询是至关重要的核心需求。风机运行产生的振动、倾角、电流、温度等参数是典型的时序数据&#xff0c;具有高并发写入、数据…...

Kubernetes控制平面组件:Kubelet详解(七):容器网络接口 CNI

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

Pandas 构建并评价聚类模型② 第六章

构建并评价聚类模型 构建并评价聚类模型一、数据读取与准备&#xff08;代码6 - 6部分&#xff09;结果代码解析 二、Kmeans聚类&#xff08;代码6 - 6部分&#xff09;结果代码解析 三、数据降维可视化&#xff08;代码6 - 6部分&#xff09;结果代码解析 四、FMI评价&#xf…...

【simulink】IEEE33节点系统潮流分析模型

目录 主要内容 程序内容 2.1 33节点simulink模型一览 2.2 节点模型图 下载链接 主要内容 该仿真采用simulink模型对33节点网络进行模拟仿真&#xff0c;在simulink模型中定义了33节点系统的电阻、电抗、节点连接关系等参数&#xff0c;通过控制块来实现信号连接关系&…...

彻底解决docker代理配置与无法拉取镜像问题

为什么会有这篇文章? 博主在去年为部署dify研究了docker,最后也是成功部署,但是因为众所周知的原因,卡ziji脖子 ,所以期间遇到各种网络问题的报错,好在最后解决了. 但时隔一年,博主最近因为学习原因又一次使用docker,原本解决的问题却又没来由的出现,且和之前有很多不同(有时…...

Linux 安装 Unreal Engine

需要对在unreal engine官网进行绑定github账号&#xff0c;然后到unreal engine github仓库中进行下载对应的版本&#xff0c;并进行安装unreal engine官网 github地址...

tensorflow图像分类预测

tensorflow图像分类预测 CPU版本和GPU版本二选一 CPU版本 pip -m install --upgrade pippip install matplotlib pillow scikit-learnpip install tensorflow-intel2.18.0GPU版本 工具 miniconda 升级依赖库 conda update --all创建目录 mkdir gpu-tf进入目录 cd gpu-tf创建虚…...

C++数组详解:一维和多维数组的定义、初始化、访问与遍历

1. 引言 数组是C中最基础的数据结构之一&#xff0c;用于存储相同类型的元素的集合。它提供了高效的内存访问方式&#xff0c;适用于需要快速查找和遍历数据的场景。本文将全面介绍&#xff1a; 一维数组的定义、初始化与遍历多维数组&#xff08;如二维数组&#xff09;的定…...

linux下编写shell脚本一键编译源码

0 前言 进行linux应用层编程时&#xff0c;经常会使用重复的命令对源码进行编译&#xff0c;然后把编译生成的可执行文件拷贝到工作目录&#xff0c;操作非常繁琐且容易出错。本文编写一个简单的shell脚本一键编译源码。 1 linux下编写shell脚本一键编译源码 shell脚本如下&…...

安卓端互动娱乐房卡系统调试实录:从UI到协议的万字深拆(第一章)

前言&#xff1a;调房卡&#xff0c;不如修空调&#xff08;但更费脑&#xff09; 老实说&#xff0c;拿到这套安卓端互动组件源码的时候&#xff0c;我内心是拒绝的。不是因为它不好&#xff0c;而是太好了&#xff0c;目录规整、界面精美、逻辑还算清晰&#xff0c;唯一的问…...