MYSQL面试知识点手册

第一部分:MySQL 基础知识

1.1 MySQL 简介

MySQL 是世界上最流行的开源关系型数据库管理系统之一,它以性能卓越、稳定可靠和易用性而闻名。MySQL 主要应用在 Web 开发、大型互联网公司、企业级应用等场景,且广泛用于构建高并发、高可用的数据驱动系统。

MySQL 的发展历史

  • MySQL 最早由瑞典公司 MySQL AB 开发,并于 1995 年首次发布。
  • 2008 年,MySQL 被 Sun Microsystems 收购,2010 年 Sun 又被 Oracle 收购,因此 MySQL 目前由 Oracle 维护和开发。
  • MySQL 有两个版本:社区版和企业版。社区版是开源和免费的,而企业版提供额外的工具和支持。

MySQL 的主要特点

  • 开源免费:社区版是完全开源的,用户可以根据需求自由定制和优化。
  • 跨平台支持:MySQL 支持多种操作系统,包括 Windows、Linux、macOS 等。
  • 高性能:MySQL 针对高并发场景进行了优化,具有很好的读写性能。
  • 灵活性:MySQL 支持多种存储引擎(如 InnoDB 和 MyISAM),用户可以根据应用需求选择适合的引擎。
  • 集群与复制:MySQL 支持主从复制、集群等高可用和容灾技术,适合构建分布式数据库系统。
1.2 MySQL 基本操作
1.2.1 创建与管理数据库

在 MySQL 中,数据库是数据的逻辑容器。我们可以通过以下命令进行数据库的管理操作:

  • 创建数据库:使用 CREATE DATABASE 命令创建新数据库。

    CREATE DATABASE my_database;
    
  • 查看现有数据库:使用 SHOW DATABASES 查看当前服务器上所有数据库。

    SHOW DATABASES;
    
  • 删除数据库:使用 DROP DATABASE 删除一个已存在的数据库。注意,删除数据库会清空其中的所有表和数据。

    DROP DATABASE my_database;
    
  • 切换数据库:在进行表操作之前,必须选择要操作的数据库。

    USE my_database;
    
1.2.2 表操作

表是 MySQL 中存储数据的基本结构。我们可以通过以下操作管理表:

  • 创建表:定义表结构时需要指定列名、数据类型和约束。

    CREATE TABLE users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        username VARCHAR(50) NOT NULL,
        email VARCHAR(100) NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
    
  • 查看表结构:使用 DESCRIBE 命令查看表的列和数据类型等信息。

    DESCRIBE users;
    
  • 修改表结构:使用 ALTER TABLE 修改表结构,比如增加列。

    ALTER TABLE users ADD phone VARCHAR(15);
    
  • 删除表:使用 DROP TABLE 删除整个表及其数据。

    DROP TABLE users;
    
1.2.3 数据操作(CRUD)

CRUD(Create、Read、Update、Delete)操作是数据库管理的核心,MySQL 提供了以下 SQL 命令来进行基本的数据操作。

  • 插入数据:使用 INSERT INTO 命令将新记录插入到表中。

    INSERT INTO users (username, email) VALUES ('JohnDoe', 'john@example.com');
    
  • 查询数据:使用 SELECT 命令检索数据,支持条件过滤、排序等操作。

    SELECT username, email FROM users WHERE email LIKE '%example.com%';
    
  • 更新数据:使用 UPDATE 命令修改表中的记录。

    UPDATE users SET email = 'john.doe@example.com' WHERE username = 'JohnDoe';
    
  • 删除数据:使用 DELETE 命令删除表中的记录。

    DELETE FROM users WHERE id = 1;
    
1.2.4 数据类型

MySQL 提供了多种数据类型,每种数据类型都适合存储特定类型的数据。常见的数据类型包括:

  • 整型(INT, TINYINT, BIGINT 等):用于存储整数值。

  • 字符串类型(VARCHAR, TEXT, BLOB 等)

    • VARCHAR:可变长度字符串,适合存储长度不固定的文本。
    • TEXT:大文本字段,存储长度超过 65535 字节的字符串。
    • BLOB:用于存储二进制大对象,如图像和音频。
  • 日期时间类型(DATE, DATETIME, TIMESTAMP)

    • DATE:用于存储日期,不包含时间部分,格式为 'YYYY-MM-DD'
    • DATETIME:包含日期和时间,格式为 'YYYY-MM-DD HH:MM:SS'
    • TIMESTAMP:存储 Unix 时间戳,会根据时区进行转换。

第二部分:MySQL 索引与优化

2.1 索引简介

索引 是数据库中的一种数据结构,用于加速数据查询。索引通过维护一个指向数据记录的结构化指针,减少了数据扫描的范围,从而提高查询效率。

索引的优点

  • 查询加速:通过索引,可以减少全表扫描,大幅度提升查询性能。
  • 唯一性约束:唯一索引可以防止表中插入重复值。

索引的缺点

  • 占用存储空间:索引需要额外的存储空间,尤其是对于大量数据的表,索引可能占用很大空间。
  • 插入/更新开销:索引需要在插入和更新时维护,增加了这些操作的复杂度和耗时。
2.2 B-Tree 和 B+Tree

B-TreeB+Tree 是 MySQL 中常用的索引结构。大多数情况下,MySQL(特别是 InnoDB 引擎)使用 B+Tree 作为默认的索引结构。

  • B-Tree:是一种平衡树结构,所有节点都按照顺序存储数据,适用于范围查询。每个节点既存储键值,也存储数据。

  • B+Tree:B+Tree 是 B-Tree 的改进版,所有的实际数据都存储在叶子节点,非叶子节点只存储键值。B+Tree 提高了数据查询的效率,因为所有数据在叶子节点上都顺序排列。

为什么 MySQL 使用 B+Tree 作为索引结构?

  • 高效的范围查询:B+Tree 的叶子节点之间通过指针相连,使得范围查询效率更高。
  • 减少磁盘 I/O:B+Tree 的每个节点可以包含多个键值,减少了磁盘的 I/O 次数,提高了查询速度。
2.3 索引优化

索引的合理设计是提高 MySQL 查询性能的关键。以下是一些常见的索引优化策略:

  1. 最左前缀匹配原则:在组合索引中,查询时必须按照索引定义的最左列开始,才能有效使用索引。例如,对于 (a, b, c) 的组合索引,查询必须至少包含 a 才能命中索引。

  2. 覆盖索引:如果查询的字段都包含在索引中,那么 MySQL 可以直接从索引中获取数据,而不需要回表查询。覆盖索引大大减少了 I/O 开销,提升查询性能。

  3. 索引失效的场景:某些情况下索引无法发挥作用:

    • LIKE 查询中使用前置通配符(如 %keyword),会导致索引失效。
    • 查询中对索引字段使用函数或类型转换也会导致索引失效。
2.4 Explain 语句

Explain 语句是 MySQL 提供的查询优化工具,用于查看 SQL 语句的执行计划。它能帮助我们分析查询的性能问题,找出 SQL 执行的瓶颈。

EXPLAIN SELECT * FROM users WHERE email = 'john.doe@example.com';

Explain 输出的关键字段

  • select_type:查询类型,如简单查询、子查询、联合查询等。
  • key:使用的索引。
  • rows:MySQL 预计需要扫描的行数。
  • extra:其他

信息,如 Using index 表示使用了覆盖索引,Using filesort 表示需要文件排序。

通过 Explain,我们可以判断 SQL 语句是否合理利用了索引,以及是否有潜在的性能问题。

第三部分:MySQL 事务与锁机制

3.1 事务的 ACID 特性

事务(Transaction) 是数据库操作的基本单位,一组数据库操作要么全部成功,要么全部回滚。MySQL 中的事务必须满足 ACID 特性:

  1. 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成。
  2. 一致性(Consistency):事务完成后,数据库必须从一个一致的状态转换到另一个一致的状态。
  3. 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务。
  4. 持久性(Durability):事务一旦提交,它对数据库的修改就是永久性的,即使数据库崩溃也不会丢失。
3.2 事务隔离级别

MySQL 支持四种事务隔离级别,分别是:

  • 读未提交(Read Uncommitted):最低隔离级别,一个事务可以读取其他未提交事务的数据,可能导致“脏读”。
  • 读已提交(Read Committed):一个事务只能读取其他已提交事务的数据,避免脏读,但可能导致“不可重复读”。
  • 可重复读(Repeatable Read):事务在读取数据时,会锁定数据,确保在同一事务中多次读取的数据一致。MySQL 默认的隔离级别,可能导致“幻读”。
  • 串行化(Serializable):最高的隔离级别,事务按顺序执行,完全避免脏读、不可重复读和幻读,但性能最低。

MySQL 默认使用 可重复读(Repeatable Read) 隔离级别。通过合理调整隔离级别,可以在性能和数据一致性之间取得平衡。

3.3 MySQL 锁机制

MySQL 提供了多种锁机制,用于保证数据一致性和并发操作的安全性。合理使用锁机制可以提高系统性能,避免数据冲突和死锁问题。

  1. 行锁和表锁

    • 表锁(Table Lock):锁住整个表,所有线程只能顺序访问该表。这种锁适用于读多写少的场景,通常开销较小,但并发性能较差。MyISAM 存储引擎使用表锁。
    • 行锁(Row Lock):锁定表中的某一行数据,其他事务仍可以操作未被锁定的行,适用于高并发场景。InnoDB 存储引擎支持行锁。
  2. InnoDB 行级锁

    • 共享锁(S 锁,Shared Lock):多个事务可以同时读取数据,但不能修改。适用于 SELECT ... LOCK IN SHARE MODE
    • 排他锁(X 锁,Exclusive Lock):只有持有排他锁的事务可以修改数据,其他事务不能同时持有排他锁或共享锁。适用于 UPDATEDELETEINSERT 操作。
  3. 锁的粒度与性能

    • 锁的粒度越小,并发性能越高,但锁的管理开销也越大。行锁提供了更高的并发性,但涉及更多复杂的锁定机制。
3.4 死锁的原因及排查方法

死锁 是指两个或多个事务在等待彼此释放资源,导致它们都无法继续执行的情况。MySQL 的 InnoDB 存储引擎在检测到死锁时,会自动回滚其中一个事务以解除死锁。

死锁的常见原因

  • 事务 A 持有资源 R1,等待资源 R2;事务 B 持有资源 R2,等待资源 R1。
  • 并发更新相同的记录,多个事务同时加锁,但顺序不一致。

如何排查死锁

  • InnoDB 死锁日志:MySQL 可以通过 SHOW ENGINE INNODB STATUS 命令查看最近的死锁信息,分析死锁发生的原因。
  • 优化 SQL 和事务:尽量让事务在一致的顺序请求资源,避免交叉锁定;尽量减少长时间持有锁的事务。
3.5 MVCC(多版本并发控制)

MVCC(Multi-Version Concurrency Control) 是 InnoDB 存储引擎实现高并发、低锁定的核心机制。它通过为每个事务生成快照,允许多个事务同时读取数据而不会互相阻塞。

  1. MVCC 实现原理

    • InnoDB 使用隐藏的 DB_TRX_IDDB_ROLL_PTR 字段来跟踪每行数据的事务信息。通过这些信息,InnoDB 可以为每个事务生成数据的不同快照。
    • 对于读取操作,事务可以读取其启动时的数据快照;对于写入操作,只有在该行未被其他事务锁定时,才能进行更新或删除。
  2. MVCC 的优势

    • 非阻塞读:读取操作不需要加锁,因此可以避免读写冲突,提高并发性。
    • 实现隔离级别:MVCC 支持 MySQL 默认的可重复读隔离级别,同时防止幻读问题。

第四部分:MySQL 存储引擎

4.1 InnoDB 和 MyISAM 的区别

MySQL 支持多种存储引擎,其中最常用的两个是 InnoDBMyISAM。选择合适的存储引擎可以显著影响数据库的性能和功能。

  1. InnoDB 存储引擎

    • 支持事务:InnoDB 是一个事务型存储引擎,支持 ACID 特性,并实现了四种事务隔离级别。
    • 行级锁定:InnoDB 使用行级锁,这为高并发场景下的读写操作提供了较好的性能。
    • 外键支持:InnoDB 支持外键约束,这使得它可以更好地维护数据的完整性。
    • 崩溃恢复:InnoDB 支持崩溃恢复机制,通过 Redo LogUndo Log 来保证数据的持久性和一致性。
  2. MyISAM 存储引擎

    • 不支持事务:MyISAM 不支持事务和外键,适合只读和插入操作较多的场景,如日志记录和统计分析系统。
    • 表级锁定:MyISAM 使用表级锁,适合读多写少的应用,但在写操作较多时性能较差。
    • 全文索引:MyISAM 提供内置的全文索引功能,适用于需要进行复杂文本搜索的场景。

选择合适的存储引擎

  • 如果需要事务支持、高并发、数据完整性,则应选择 InnoDB。
  • 如果是只读数据或日志类应用,可以考虑使用 MyISAM。
4.2 InnoDB 存储引擎原理

InnoDB 是 MySQL 默认的存储引擎,适用于大部分高并发、高可靠性的应用场景。以下是 InnoDB 的几个关键机制:

  1. 聚簇索引(Clustered Index)

    • 在 InnoDB 中,数据是按主键顺序存储的,主键索引即为聚簇索引。每张表必须有且仅有一个聚簇索引。
    • 优点:聚簇索引使得按主键查询效率非常高,因为数据和索引存储在一起,减少了磁盘 I/O。
  2. InnoDB 的页和段

    • InnoDB 以页(Page)为单位存储数据,默认每页大小为 16KB。
    • 数据页通过段(Segment)组织管理,每个表对应多个段,InnoDB 通过这种结构实现高效的存储管理。
  3. 双写机制(Doublewrite)

    • 双写机制通过将数据写入两次来保证数据的一致性。首先将数据写入磁盘的日志文件中,然后写入实际的数据文件中。即使在崩溃时,InnoDB 也可以通过重放日志恢复数据。
  4. 自适应哈希索引(Adaptive Hash Index, AHI)

    • InnoDB 会自动将频繁访问的数据页转化为哈希索引,从而提高查询性能。自适应哈希索引可以通过监测访问模式动态调整。

第五部分:MySQL 优化

5.1 SQL 优化

SQL 优化是提升 MySQL 性能的核心部分。合理的 SQL 语句设计可以大幅度减少数据库的查询时间,提升整体系统性能。

  1. 避免全表扫描

    • 如果查询条件不带索引字段,MySQL 会进行全表扫描,耗费大量资源。应确保查询条件中使用了索引。
    • 通过 EXPLAIN 查看查询的执行计划,确认 SQL 是否利用了索引。
  2. 避免 SELECT * 查询

    • SELECT * 会返回表中的所有列,可能导致不必要的数据传输。应尽量明确查询所需的列,以减少数据传输和处理。
  3. 合理使用 JOIN

    • 尽量减少不必要的 JOIN,复杂的多表 JOIN 查询可能导致性能问题。对于大表的联合查询,建议适当进行表拆分。
  4. 分页查询优化

    • 大量数据分页查询时,OFFSET 大时会导致性能下降。可以使用主键或索引字段进行优化。
    SELECT * FROM users WHERE id > 1000 LIMIT 10;
    
5.2 表设计优化
  1. 表规范化与反规范化

    • 规范化有助于减少数据冗余,提升数据库的一致性;反规范化则通过数据冗余减少 JOIN 操作,提升查询性能。
    • 在设计表结构时,应根据实际的应用场景权衡规范化与反规范化的利弊。
  2. 选择合适的数据类型

    • 合理选择字段的数据类型可以显著提高存储效率和查询性能。例如,使用 VARCHAR 而不是 TEXT 存储短文本,使用 INT 而不是 BIGINT 存储整数。
  3. 表分区与分表策略

    • 对于大表,可以通过表分区(Partitioning)或分表来提高查询性能。分区可以按时间、范围等规则将

数据划分为多个物理文件,减少每次查询扫描的数据量。

5.3 查询缓存优化

查询缓存 是 MySQL 的一种机制,用于缓存查询的结果,以提高查询性能。

  • 工作机制:当查询缓存开启时,MySQL 会将 SELECT 语句的结果缓存起来,下次遇到相同的查询语句时直接从缓存中返回结果。

  • 缓存的局限性

    • 当表中的数据发生变化(如插入、更新或删除),对应的查询缓存会失效。
    • 对于频繁更新的表,查询缓存的效果较差,甚至可能降低性能。

禁用场景:对于频繁写操作的表,可以通过配置禁用查询缓存,避免缓存失效带来的额外开销。

5.4 慢查询优化

慢查询日志 是 MySQL 提供的一种记录查询执行时间过长的 SQL 语句的功能,帮助我们找到数据库性能的瓶颈。

  1. 启用慢查询日志

    • 通过配置 slow_query_log 参数启用慢查询日志,并设置 long_query_time 参数来定义慢查询的时间阈值。
    SET GLOBAL slow_query_log = 1;
    SET GLOBAL long_query_time = 2;
    
  2. 分析慢查询日志

    • 慢查询日志记录了所有执行时间超过指定阈值的 SQL 语句。通过分析这些语句,可以找出哪些查询导致了数据库性能问题。
    • 结合 EXPLAIN 分析慢查询的执行计划,确定是否有未使用索引、全表扫描等问题。

第六部分:MySQL 日志机制

6.1 MySQL 日志类型

MySQL 提供了多种日志机制,用于记录数据库的操作、状态和执行过程中的问题。这些日志在性能调优、故障排查和数据恢复等方面非常重要。常见的 MySQL 日志包括:

  1. 二进制日志(Binary Log)

    • 记录所有对数据库进行更改的 SQL 语句或事件,用于数据恢复和主从复制。
    • 二进制日志是 MySQL 中最重要的日志之一,在灾难恢复和复制中扮演关键角色。
  2. 错误日志(Error Log)

    • 记录 MySQL 服务器启动、停止以及运行期间发生的错误信息。
    • 是 MySQL 排查故障和异常问题的主要依据。
  3. 查询日志(General Query Log)

    • 记录所有发送到 MySQL 服务器的 SQL 语句,无论这些查询是否成功。
    • 用于调试和审计操作,但由于性能开销大,生产环境中通常关闭。
  4. 慢查询日志(Slow Query Log)

    • 记录执行时间超过设定阈值的 SQL 语句,有助于分析和优化性能瓶颈。
    • 可以通过 long_query_time 设置慢查询的时间阈值。
6.2 二进制日志(Binary Log)

二进制日志(Binlog)是 MySQL 中用于记录数据库更改的日志,它不仅是数据恢复的重要手段,还用于实现主从复制。

  1. Binary Log 的作用

    • 数据恢复:在数据库崩溃或数据丢失的情况下,二进制日志可以用来恢复最后一次备份之后的所有数据更改。
    • 主从复制:在主从复制架构中,主库会将所有数据更改记录到二进制日志中,从库会读取这些日志并同步数据。
  2. 二进制日志的格式

    • Row 格式:记录每一行数据的变更,能精确地记录每次操作,适用于复杂表结构的复制。
    • Statement 格式:记录每条 SQL 语句,适用于简单 SQL 语句的复制,但对于某些复杂语句可能会有问题。
    • Mixed 格式:结合了 Row 和 Statement 两种格式,MySQL 会根据 SQL 语句的复杂度自动选择最合适的记录方式。
  3. 管理二进制日志

    • 开启二进制日志:通过 log-bin 参数开启。
    • 查看日志文件:使用 SHOW BINARY LOGS; 查看现有的二进制日志文件。
    • 清理旧的日志文件:使用 PURGE BINARY LOGS 命令清除指定日期之前的二进制日志,以释放磁盘空间。
6.3 Redo Log 和 Undo Log

Redo LogUndo Log 是 InnoDB 存储引擎提供的两个重要的日志机制,它们主要用于保证数据库的事务一致性和崩溃恢复。

  1. Redo Log(重做日志)

    • 作用:用于保证事务的持久性(Durability),即使在系统崩溃后,数据库仍然可以通过重做日志恢复未完成的事务。
    • 原理:InnoDB 会先将事务的更改写入 Redo Log,然后再写入数据文件。即使系统崩溃,也可以通过 Redo Log 恢复数据库到事务提交时的状态。
  2. Undo Log(回滚日志)

    • 作用:用于实现事务的回滚和 MVCC(多版本并发控制)。当事务失败或被回滚时,Undo Log 可以撤销事务对数据的更改。
    • 原理:每次事务操作前,InnoDB 会将数据的旧版本写入 Undo Log。如果事务失败,系统会利用 Undo Log 恢复数据。

Redo Log 和 Binary Log 的区别

  • Redo Log 记录的是物理层面的页修改,用于崩溃恢复,保证事务持久性。
  • Binary Log 记录的是逻辑层面的 SQL 语句或数据变更,用于主从复制和数据恢复。

第七部分:MySQL 主从复制与集群

7.1 主从复制

主从复制 是 MySQL 中常用的高可用和数据同步机制,允许一个 MySQL 服务器(主库)将其数据更改同步到一个或多个从库。通过主从复制,可以实现读写分离、负载均衡以及数据冗余等功能。

  1. 主从复制的基本原理

    • 主库记录所有数据修改操作到二进制日志(Binlog)中。
    • 从库通过 I/O 线程读取主库的二进制日志,并将其保存为中继日志(Relay Log)。
    • 从库通过 SQL 线程读取中继日志中的 SQL 语句,并执行这些语句以达到与主库一致的状态。
  2. 主从复制的类型

    • 异步复制:主库将数据写入二进制日志后立即返回,不等待从库的确认。这种方式下,从库可能会有一定的延迟。
    • 半同步复制:主库在写入二进制日志后,需要等待至少一个从库确认已收到日志,才返回给客户端。
    • 全同步复制:主库只有在所有从库都确认收到日志后,才会返回给客户端。这种方式在网络延迟高或从库较多时性能较差。
  3. 搭建主从复制

    • 在主库中配置 log-bin 以开启二进制日志,并设置 server-id
    • 在从库中配置 server-id,并通过 CHANGE MASTER TO 指定主库的地址、用户和二进制日志的起始位置。
    • 启动从库复制线程:START SLAVE;
7.2 主从延迟问题

主从延迟是指从库无法及时同步主库的数据更改,导致从库中的数据滞后于主库。常见的延迟原因包括:

  1. 网络延迟:主从之间的网络传输性能低下,会增加 I/O 线程读取二进制日志的时间。
  2. 从库的性能问题:如果从库的 CPU 或磁盘性能较差,SQL 线程可能无法及时执行主库传来的 SQL 语句。
  3. 主库负载过高:主库负载过高时,二进制日志的生成速度会超过从库的同步速度。

优化方法

  • 提高网络带宽,减少网络延迟。
  • 升级从库的硬件资源,或配置多个从库分担读操作。
  • 对主库进行性能优化,减少大批量数据更新操作的频率。
7.3 MySQL 集群

MySQL 集群是用于实现高可用性和高可扩展性的数据库解决方案,常见的 MySQL 集群架构包括:

  1. MySQL Cluster

    • MySQL Cluster 是一种基于 NDB 存储引擎的分布式数据库架构,适合高可用、低延迟的实时应用。
    • 特点:所有数据会被分布存储在多个节点中,支持无单点故障和自动故障恢复。
  2. MHA(Master High Availability)

    • MHA 是一种自动故障切换方案,当主库出现故障时,MHA 可以自动将某个从库提升为新的主库。
    • 优点:MHA 提供了自动故障切换和数据恢复的功能,确保数据库的高可用性。
  3. Galera Cluster

    • Galera Cluster 是一种同步多主复制的集群解决方案,支持多主写入,确保多个节点之间的数据一致性。
    • 特点:Galera 通过组通信协议实现数据复制,适用于需要多主写入的场景。

第八部分:MySQL 高级面试问题

8.1 如何排查 MySQL 的性能问题?

性能问题排查 是 MySQL 面试中的高频考题,通常涉及以下几个工具和步骤:

  1. Explain:分析 SQL 查询的执行计划,检查是否使用了索引,是否存在全表扫描。

    EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
    
  2. 慢查询日志:通过慢查询日志,识别出执行时间较长的 SQL 语句,并对其进行优化。

    SET GLOBAL slow_query_log = 1;
    SET GLOBAL long_query_time = 1;
    
  3. Show Profiles:用于查看每条查询的执行细节,包括 CPU 时间、IO 等。

    SHOW PROFILES;
    
  4. 系统性能监控:结合系统级的性能工具(如 topiotopvmstat)分析 CPU、内存、磁盘 IO 的瓶颈。

8.2 如何解决 MySQL 死锁问题?
  1. 通过 InnoDB 状态查看死锁

    SHOW ENGINE INNODB STATUS;
    
  2. 分析死锁原因

    • 分析锁定顺序,确保事务按相同的顺序请求锁,以避免交叉等待。
    • 通过减少长事务或分解复杂查询,减少锁定的持续时间。
8.3 如何优化 MySQL 连接数问题?

在高并发场景下,MySQL 的连接数可能成为瓶颈。可以通过以下策略进行优化:

  1. 调整 max_connections:增加 MySQL 的最大连接数限制。

    SET GLOBAL max_connections = 500;
    
  2. 使用连接池:通过连接池复用连接,避免频繁创建和关闭连接的开销。常见的连接池方案有 HikariCP、Druid 等。

  3. 优化长连接:使用长连接可以减少频繁的连接创建开销,但需要定期释放空闲连接,避免占用资源。

8.4 大数据量下如何提高查询性能?
  1. 表分区与分表策略

    • 对于大表,可以根据时间、范围等条件进行分区,或者将大表拆分为多个表,以提高查询性能。
  2. 使用覆盖索引:通过建立覆盖索引,减少回表操作。

    SELECT id, email FROM users WHERE id > 1000;
    
  3. 优化分页查询:避免使用 OFFSET 较大的分页查询,改为基于主键或索引进行分页。

    SELECT * FROM users WHERE id > 10000 LIMIT 100;
    

总结

这本 MySQL 面试知识点手册从 MySQL 的基础知识、索引优化、事务与锁机制、存储引擎、性能优化、日志机制、主从复制与集群等多个方面,系统地介绍了 MySQL 的关键概念与高级操作技巧。通过掌握这些知识,读者可以更好地应对 MySQL 面试中的各种问题,同时具备在实际工作中优化和管理 MySQL 数据库的能力。

本手册强调了实践中的调优方法和问题排查策略,希望能帮助读者在面试中展现出扎实的 MySQL 技能,顺利通过技术考核。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/881320.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工程师 - PFM介绍

在电子电路设计中,PFM(Pulse Frequency Modulation,脉冲频率调制)是一种调制技术,其主要特点是在负载变化时调整脉冲的频率,而保持脉冲的宽度(时间长度)相对恒定。与PWM(…

记忆化搜索专题——算法简介力扣实战应用

目录 1、记忆化搜索算法简介 1.1 什么是记忆化搜索 1.2 如何实现记忆化搜索 1.3 记忆化搜索与动态规划的区别 2、算法应用【leetcode】 2.1 题一:斐波那契数 2.1.1 递归暴搜解法代码 2.1.2 记忆化搜索解法代码 2.1.3 动态规划解法代码 2.2 题二&#xff1…

Transformer预测 | 基于Transformer心率时间序列预测(tensorflow)

效果一览 基本介绍 Transformer预测 | 基于Transformer心率时间序列预测(tensorflow) 程序设计 import pandas as pd from pandas.plotting import lag_plot from statsmodels.graphics

加密与安全_优雅存储二要素(AES-256-GCM )

文章目录 什么是二要素如何保护二要素(姓名和身份证)加密算法分类场景选择算法选择AES - ECB 模式 (不推荐)AES - CBC 模式GCM(Galois/Counter Mode)AES-256-GCM简介AES-256-GCM工作原理安全优势 应用场景其他模式 和 敏感数据加密…

AIoT智能工控板

在当今竞争激烈的商业环境中,企业需要强大的科技力量来助力腾飞,AIoT智能工控板就是这样的力量源泉。 其领先的芯片架构设计,使得主板的性能得到了极大的提升。无论是数据的处理速度、图形的渲染能力,还是多任务的并行处理能力&a…

Ceph官方文档_01_Ceph简介

目录 Ceph介绍Ceph介绍 Ceph可用于向云平台提供Ceph对象存储,Ceph可用于向云平台提供Ceph块设备服务。Ceph可用于部署Ceph文件系统。所有Ceph存储群集部署开始都是先设置每个Ceph节点,然后再设置网络。 Ceph存储集群需要以下内容:至少一个Ceph监视器和至少一个Ceph管理器,…

毕业设计选题:基于ssm+vue+uniapp的捷邻小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

Linux top命令详解与重点内容说明

文章目录 重点说明基本信息进程(任务)信息cpu占用信息%Cpu(s)内存信息交换内存信息每列含义说明交互命令多窗口模式颜色配置命令参数 重点说明 top命令非常强大,也非常复杂,很难面面俱到,也没有必要,这篇文章的目的是介绍重点&am…

en造数据结构与算法C# 群组行为优化 和 头鸟控制

实现: 1.给鸟类随机播放随机动画使得每一只鸟扇翅膀的频率都不尽相同 2.可以自行添加权重,并在最后 sumForce separationForce cohesionForce alignmentForce;分别乘上相应权重,这样鸟就能快速飞行和转向辣 using System.Collections.Ge…

Linux系统编程(基础指令)上

1.Linux常见目录介绍 Linux目录为树形结构 /:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录&…

Unity3D入门(二) :Unity3D实现视角的丝滑过渡切换

1. 前言 上篇文章,我们已经初步了解了Unity3D,并新建并运行起来了一个项目,使相机视角自动围绕着立方体旋转。 这篇文章,我们来讲一下Unity3D怎么过渡地切换视角。 我们继续是我上篇文章中的项目,但是需要向把Camera…

​OpenAI最强模型o1系列:开启人工智能推理新时代

前不久OpenAI发布全新模型——o1模型,也就是业界说的“草莓模型”,包含三款型号:OpenAI o1、OpenAI o1-preview和OpenAI o1-mini。 其中,OpenAI o1-mini和 o1-preview已经对用户开放使用: OpenAI o1:高级推…

企业急于采用人工智能,忽视了安全强化

对主要云提供商基础设施上托管的资产的安全分析显示,许多公司为了急于构建和部署 AI 应用程序而打开安全漏洞。常见的发现包括对 AI 相关服务使用默认且可能不安全的设置、部署易受攻击的 AI 软件包以及不遵循安全强化指南。 这项分析由 Orca Security 的研究人员进…

Redis学习以及SpringBoot集成使用Redis

目录 一、Redis概述 二、Linux下使用Docker安装Redis 三、SpringBoot集成使用Redis 3.1 添加redis依赖 3.2 配置连接redis 3.3 实现序列化 3.4 注入RedisTemplate 3.5 测试 四、Redis数据结构 一、Redis概述 什么是redis? redis 是一个高性能的&#xf…

vue项目加载cdn失败解决方法

注释index.html文件中 找到vue.config.js文件注释、

【Python语言初识(二)】

一、分支结构 1.1、if语句 在Python中,要构造分支结构可以使用if、elif和else关键字。所谓关键字就是有特殊含义的单词,像if和else就是专门用于构造分支结构的关键字,很显然你不能够使用它作为变量名(事实上,用作其他…

0基础带你入门Linux之使用

1.Ubuntu软件管理 回顾一下,我们之前使用su root切换到root模式,使用who 发现为什么显示的还是bd用户呢?为什么呢? 这个who是主要来查看的是我们登录的时候是以什么用户登录的 所以即使我们使用who进行查看的时候显示的还是bd用…

【JavaWeb】利用IDEA2024+tomcat10配置web6.0版本搭建JavaWeb开发项目

之前写过一篇文章:《【JavaWeb】利用IntelliJ IDEA 2024.1.4 Tomcat10 搭建Java Web项目开发环境(图文超详细)》详细讲解了如何搭建JavaWeb项目的开发环境,里面默认使用的Web版本是4.0版本的。但在某些时候tomcat10可能无法运行we…

提升效率的AI工具集 - 轻松实现自动化

在这个快节奏、高效率的社会中,我们每个人都渴望能够找到提升工作效率的捷径。幸运的是,随着人工智能(AI)技术的迅猛发展,越来越多的AI工具涌现出来,为我们提供了强大的支持。这些工具不仅能够帮助我们提高…

计算机毕业设计 美发管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…