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.rhkb.cn/news/428021.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react 基础语法

前置知识 类的回顾 通过class关键字定义一个类 类名首字母大写 class类有constructor构造器 new 一个类得到一个实例 类还有方法,该方法也会在其原型上 static静态数据,访问静态属性通过 类名.id getter和setter getter:定义一个属性&…

计算机人工智能前沿进展-大语言模型方向-2024-09-20

计算机人工智能前沿进展-大语言模型方向-2024-09-20 1. Multimodal Fusion with LLMs for Engagement Prediction in Natural Conversation Authors: Cheng Charles Ma, Kevin Hyekang Joo, Alexandria K. Vail, Sunreeta Bhattacharya, Alvaro Fern’andez Garc’ia, Kailan…

day51

shell脚本 修改环境变量 1) 查看已有的特殊系统变量 系统配置好的,内置的环境 env 或者 printenv 2) 查看环境变量 echo $HOME 环境变量的作用: 当在终端直接运行指令时,会默认去环境变量保存的路径中查找指令,如果没找到该…

Zookeeper安装使用教程

# 安装 官网下载安装包 #配置文件 端口默认8080,可能需要更改一下 #启动 cd /Users/lisongsong/software/apache-zookeeper-3.7.2-bin/bin ./zkServer.sh start #查看运行状态 ./zkServer.sh status #停止 ./zkServer.sh stop #启动客户端 ./zkCli.sh ls /

【高分系列卫星简介】

高分系列卫星是中国国家高分辨率对地观测系统(简称“高分工程”)的重要组成部分,旨在提供全球范围内的高分辨率遥感数据,广泛应用于环境监测、灾害应急、城市规划、农业估产等多个领域。以下是对高分系列卫星及其数据、相关参数和…

英语六级-学习

01 英语分值比例 02听力学习 听力练习,基础好选择标准VOA和BBC。基础差选择VOA慢速。 听力内容包括不受政治争议的内容,社会生活类(奇闻趣事、日常生活)、经济类(商务、职场相关)、环保类、互联网类---------根据各类主题快速找到录音材料中心点。 研…

搭建本地DVWA靶场教程 及 靶场使用示例

1. DVWA简介 DVWA(Damn Vulnerable Web Application)一个用来进行安全脆弱性鉴定的PHP/MySQL Web 应用平台,旨在为网络安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用安全防范的过程。 DVW…

数据结构之二叉树(1)

数据结构之二叉树(1) 一、树 1、树的概念与结构 (1)树是一种非线性的数据结构,由n(n>0)个有限结点组成一个具有层次关系的集合。 (2)树有一个特殊的结点,叫做根结点&#xff…

村落检测系统源码分享

村落检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

Linux 查看磁盘 df -h 已经查看目录大小 du -sh ./*

使用df -h 命令可以查看磁盘信息 df -h 如下图所示: 获取当前目录 每个目录大小 du -sh ./* du -sh ./* 如果文件比较多 我们想获取文件大小最大的前10个 可以运行如下命令: du -ah | sort -rh | head -n 10 du -ah:显示当前目录及其子目录的所有文件和目录的…

条件编译代码记录

#include <iostream>// 基类模板 template<typename T> class Base { public:void func() {std::cout << "Base function" << std::endl;} };// 特化的子类 template<typename T> class Derived : public Base<T> { public:void…

【混淆矩阵】Confusion Matrix!定量评价的基础!如何计算全面、准确的定量指标去衡量模型分类的好坏??

【混淆矩阵】Confusion Matrix&#xff01;定量评价的基础&#xff01; 如何计算全面、准确的定量指标去衡量模型分类的好坏&#xff1f;&#xff1f; 文章目录 【混淆矩阵】Confusion Matrix&#xff01;定量评价的基础&#xff01;1. 混淆矩阵2.评价指标3.混淆矩阵及评价指标…

Mysql InnoDB 存储引擎简介

InnoDB 存储引擎是 Mysql 的默认存储引擎&#xff0c;它是由 Innobase Oy 公司开发的 Mysql 为什么默认使用 InnoDB 存储引擎 InnoDB 是一款兼顾高可靠性和高性能的通用存储引擎 在 Mysql 5.5 版本之前&#xff0c;默认是使用 MyISAM 存储引擎&#xff0c;在 5.5 及其之后版…

【红动中国-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

Java原生HttpURLConnection实现Get、Post、Put和Delete请求完整工具类分享

这里博主纯手写了一个完整的 HTTP 请求工具类&#xff0c;该工具类支持多种请求方法&#xff0c;包括 GET、POST、PUT 和 DELETE&#xff0c;并且可以选择性地使用身份验证 token。亲测可用&#xff0c;大家可以直接复制并使用这段代码&#xff0c;以便在自己的项目中快速实现 …

powerbi -L10-文件夹内的文件名

powerbi -L10-文件夹内的文件名 Folder.Contents letSource Folder.Contents("\\your_folder\ your_folder "),#"Removed Other Columns" Table.SelectColumns(Source,{"Name", "Date modified", "Folder Path"}), in#&q…

云原生信息安全:筑牢数字化时代的安全防线

云原生信息安全&#xff1a;筑牢数字化时代的安全防线 一、云原生信息安全概述 云原生安全包含两层重要含义。一方面&#xff0c;面向云原生环境的安全&#xff0c;目标是防护云原生环境中的基础设施、编排系统和微服务等系统的安全。在云原生内部&#xff0c;安全机制多以云原…

7个提升网站分页体验的 CSS 和 JavaScript 代码片段

文章目录 前言正文1.简洁直观的悬停分页效果2.实时显示页码的分页3.适合响应式设计的多功能分页4.专为移动设备优化的分页5.无数字的极简分页设计6.触屏友好的分页7.结合无限滚动与分页的设计 总结 前言 分页是内容丰富的网站中不可缺少的导航工具&#xff0c;能帮助用户更轻松…

【数据结构】什么是二叉搜索(排序)树?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;二叉搜索(排序)树的概念 &#x1f4cc;二叉搜索(排序)树的操作 &#x1f38f;二叉搜索树的查找 &#x1f38f;二叉搜索树的插入 &#x1f38f;二叉搜索树的…

how can I train a OpenAI fine tuned model with more prompts

题意&#xff1a;我如何使用更多提示来训练一个 OpenAI 微调模型&#xff1f; 问题背景&#xff1a; I fine-tuned OpenAI model with some prompts following this documentation it succeeded and created a new model in the playground. How I can retrain (fine-tune) th…