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-Tree 和 B+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 查询性能的关键。以下是一些常见的索引优化策略:
-
最左前缀匹配原则:在组合索引中,查询时必须按照索引定义的最左列开始,才能有效使用索引。例如,对于
(a, b, c)
的组合索引,查询必须至少包含a
才能命中索引。 -
覆盖索引:如果查询的字段都包含在索引中,那么 MySQL 可以直接从索引中获取数据,而不需要回表查询。覆盖索引大大减少了 I/O 开销,提升查询性能。
-
索引失效的场景:某些情况下索引无法发挥作用:
- 在
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 特性:
- 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成。
- 一致性(Consistency):事务完成后,数据库必须从一个一致的状态转换到另一个一致的状态。
- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务。
- 持久性(Durability):事务一旦提交,它对数据库的修改就是永久性的,即使数据库崩溃也不会丢失。
3.2 事务隔离级别
MySQL 支持四种事务隔离级别,分别是:
- 读未提交(Read Uncommitted):最低隔离级别,一个事务可以读取其他未提交事务的数据,可能导致“脏读”。
- 读已提交(Read Committed):一个事务只能读取其他已提交事务的数据,避免脏读,但可能导致“不可重复读”。
- 可重复读(Repeatable Read):事务在读取数据时,会锁定数据,确保在同一事务中多次读取的数据一致。MySQL 默认的隔离级别,可能导致“幻读”。
- 串行化(Serializable):最高的隔离级别,事务按顺序执行,完全避免脏读、不可重复读和幻读,但性能最低。
MySQL 默认使用 可重复读(Repeatable Read) 隔离级别。通过合理调整隔离级别,可以在性能和数据一致性之间取得平衡。
3.3 MySQL 锁机制
MySQL 提供了多种锁机制,用于保证数据一致性和并发操作的安全性。合理使用锁机制可以提高系统性能,避免数据冲突和死锁问题。
-
行锁和表锁:
- 表锁(Table Lock):锁住整个表,所有线程只能顺序访问该表。这种锁适用于读多写少的场景,通常开销较小,但并发性能较差。MyISAM 存储引擎使用表锁。
- 行锁(Row Lock):锁定表中的某一行数据,其他事务仍可以操作未被锁定的行,适用于高并发场景。InnoDB 存储引擎支持行锁。
-
InnoDB 行级锁:
- 共享锁(S 锁,Shared Lock):多个事务可以同时读取数据,但不能修改。适用于
SELECT ... LOCK IN SHARE MODE
。 - 排他锁(X 锁,Exclusive Lock):只有持有排他锁的事务可以修改数据,其他事务不能同时持有排他锁或共享锁。适用于
UPDATE
、DELETE
、INSERT
操作。
- 共享锁(S 锁,Shared Lock):多个事务可以同时读取数据,但不能修改。适用于
-
锁的粒度与性能:
- 锁的粒度越小,并发性能越高,但锁的管理开销也越大。行锁提供了更高的并发性,但涉及更多复杂的锁定机制。
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 存储引擎实现高并发、低锁定的核心机制。它通过为每个事务生成快照,允许多个事务同时读取数据而不会互相阻塞。
-
MVCC 实现原理:
- InnoDB 使用隐藏的
DB_TRX_ID
和DB_ROLL_PTR
字段来跟踪每行数据的事务信息。通过这些信息,InnoDB 可以为每个事务生成数据的不同快照。 - 对于读取操作,事务可以读取其启动时的数据快照;对于写入操作,只有在该行未被其他事务锁定时,才能进行更新或删除。
- InnoDB 使用隐藏的
-
MVCC 的优势:
- 非阻塞读:读取操作不需要加锁,因此可以避免读写冲突,提高并发性。
- 实现隔离级别:MVCC 支持 MySQL 默认的可重复读隔离级别,同时防止幻读问题。
第四部分:MySQL 存储引擎
4.1 InnoDB 和 MyISAM 的区别
MySQL 支持多种存储引擎,其中最常用的两个是 InnoDB 和 MyISAM。选择合适的存储引擎可以显著影响数据库的性能和功能。
-
InnoDB 存储引擎:
- 支持事务:InnoDB 是一个事务型存储引擎,支持 ACID 特性,并实现了四种事务隔离级别。
- 行级锁定:InnoDB 使用行级锁,这为高并发场景下的读写操作提供了较好的性能。
- 外键支持:InnoDB 支持外键约束,这使得它可以更好地维护数据的完整性。
- 崩溃恢复:InnoDB 支持崩溃恢复机制,通过
Redo Log
和Undo Log
来保证数据的持久性和一致性。
-
MyISAM 存储引擎:
- 不支持事务:MyISAM 不支持事务和外键,适合只读和插入操作较多的场景,如日志记录和统计分析系统。
- 表级锁定:MyISAM 使用表级锁,适合读多写少的应用,但在写操作较多时性能较差。
- 全文索引:MyISAM 提供内置的全文索引功能,适用于需要进行复杂文本搜索的场景。
选择合适的存储引擎:
- 如果需要事务支持、高并发、数据完整性,则应选择 InnoDB。
- 如果是只读数据或日志类应用,可以考虑使用 MyISAM。
4.2 InnoDB 存储引擎原理
InnoDB 是 MySQL 默认的存储引擎,适用于大部分高并发、高可靠性的应用场景。以下是 InnoDB 的几个关键机制:
-
聚簇索引(Clustered Index):
- 在 InnoDB 中,数据是按主键顺序存储的,主键索引即为聚簇索引。每张表必须有且仅有一个聚簇索引。
- 优点:聚簇索引使得按主键查询效率非常高,因为数据和索引存储在一起,减少了磁盘 I/O。
-
InnoDB 的页和段:
- InnoDB 以页(Page)为单位存储数据,默认每页大小为 16KB。
- 数据页通过段(Segment)组织管理,每个表对应多个段,InnoDB 通过这种结构实现高效的存储管理。
-
双写机制(Doublewrite):
- 双写机制通过将数据写入两次来保证数据的一致性。首先将数据写入磁盘的日志文件中,然后写入实际的数据文件中。即使在崩溃时,InnoDB 也可以通过重放日志恢复数据。
-
自适应哈希索引(Adaptive Hash Index, AHI):
- InnoDB 会自动将频繁访问的数据页转化为哈希索引,从而提高查询性能。自适应哈希索引可以通过监测访问模式动态调整。
第五部分:MySQL 优化
5.1 SQL 优化
SQL 优化是提升 MySQL 性能的核心部分。合理的 SQL 语句设计可以大幅度减少数据库的查询时间,提升整体系统性能。
-
避免全表扫描:
- 如果查询条件不带索引字段,MySQL 会进行全表扫描,耗费大量资源。应确保查询条件中使用了索引。
- 通过
EXPLAIN
查看查询的执行计划,确认 SQL 是否利用了索引。
-
避免 SELECT * 查询:
SELECT *
会返回表中的所有列,可能导致不必要的数据传输。应尽量明确查询所需的列,以减少数据传输和处理。
-
合理使用 JOIN:
- 尽量减少不必要的
JOIN
,复杂的多表JOIN
查询可能导致性能问题。对于大表的联合查询,建议适当进行表拆分。
- 尽量减少不必要的
-
分页查询优化:
- 大量数据分页查询时,
OFFSET
大时会导致性能下降。可以使用主键或索引字段进行优化。
SELECT * FROM users WHERE id > 1000 LIMIT 10;
- 大量数据分页查询时,
5.2 表设计优化
-
表规范化与反规范化:
- 规范化有助于减少数据冗余,提升数据库的一致性;反规范化则通过数据冗余减少
JOIN
操作,提升查询性能。 - 在设计表结构时,应根据实际的应用场景权衡规范化与反规范化的利弊。
- 规范化有助于减少数据冗余,提升数据库的一致性;反规范化则通过数据冗余减少
-
选择合适的数据类型:
- 合理选择字段的数据类型可以显著提高存储效率和查询性能。例如,使用
VARCHAR
而不是TEXT
存储短文本,使用INT
而不是BIGINT
存储整数。
- 合理选择字段的数据类型可以显著提高存储效率和查询性能。例如,使用
-
表分区与分表策略:
- 对于大表,可以通过表分区(Partitioning)或分表来提高查询性能。分区可以按时间、范围等规则将
数据划分为多个物理文件,减少每次查询扫描的数据量。
5.3 查询缓存优化
查询缓存 是 MySQL 的一种机制,用于缓存查询的结果,以提高查询性能。
-
工作机制:当查询缓存开启时,MySQL 会将 SELECT 语句的结果缓存起来,下次遇到相同的查询语句时直接从缓存中返回结果。
-
缓存的局限性:
- 当表中的数据发生变化(如插入、更新或删除),对应的查询缓存会失效。
- 对于频繁更新的表,查询缓存的效果较差,甚至可能降低性能。
禁用场景:对于频繁写操作的表,可以通过配置禁用查询缓存,避免缓存失效带来的额外开销。
5.4 慢查询优化
慢查询日志 是 MySQL 提供的一种记录查询执行时间过长的 SQL 语句的功能,帮助我们找到数据库性能的瓶颈。
-
启用慢查询日志:
- 通过配置
slow_query_log
参数启用慢查询日志,并设置long_query_time
参数来定义慢查询的时间阈值。
SET GLOBAL slow_query_log = 1; SET GLOBAL long_query_time = 2;
- 通过配置
-
分析慢查询日志:
- 慢查询日志记录了所有执行时间超过指定阈值的 SQL 语句。通过分析这些语句,可以找出哪些查询导致了数据库性能问题。
- 结合
EXPLAIN
分析慢查询的执行计划,确定是否有未使用索引、全表扫描等问题。
第六部分:MySQL 日志机制
6.1 MySQL 日志类型
MySQL 提供了多种日志机制,用于记录数据库的操作、状态和执行过程中的问题。这些日志在性能调优、故障排查和数据恢复等方面非常重要。常见的 MySQL 日志包括:
-
二进制日志(Binary Log):
- 记录所有对数据库进行更改的 SQL 语句或事件,用于数据恢复和主从复制。
- 二进制日志是 MySQL 中最重要的日志之一,在灾难恢复和复制中扮演关键角色。
-
错误日志(Error Log):
- 记录 MySQL 服务器启动、停止以及运行期间发生的错误信息。
- 是 MySQL 排查故障和异常问题的主要依据。
-
查询日志(General Query Log):
- 记录所有发送到 MySQL 服务器的 SQL 语句,无论这些查询是否成功。
- 用于调试和审计操作,但由于性能开销大,生产环境中通常关闭。
-
慢查询日志(Slow Query Log):
- 记录执行时间超过设定阈值的 SQL 语句,有助于分析和优化性能瓶颈。
- 可以通过
long_query_time
设置慢查询的时间阈值。
6.2 二进制日志(Binary Log)
二进制日志(Binlog)是 MySQL 中用于记录数据库更改的日志,它不仅是数据恢复的重要手段,还用于实现主从复制。
-
Binary Log 的作用:
- 数据恢复:在数据库崩溃或数据丢失的情况下,二进制日志可以用来恢复最后一次备份之后的所有数据更改。
- 主从复制:在主从复制架构中,主库会将所有数据更改记录到二进制日志中,从库会读取这些日志并同步数据。
-
二进制日志的格式:
- Row 格式:记录每一行数据的变更,能精确地记录每次操作,适用于复杂表结构的复制。
- Statement 格式:记录每条 SQL 语句,适用于简单 SQL 语句的复制,但对于某些复杂语句可能会有问题。
- Mixed 格式:结合了 Row 和 Statement 两种格式,MySQL 会根据 SQL 语句的复杂度自动选择最合适的记录方式。
-
管理二进制日志:
- 开启二进制日志:通过
log-bin
参数开启。 - 查看日志文件:使用
SHOW BINARY LOGS;
查看现有的二进制日志文件。 - 清理旧的日志文件:使用
PURGE BINARY LOGS
命令清除指定日期之前的二进制日志,以释放磁盘空间。
- 开启二进制日志:通过
6.3 Redo Log 和 Undo Log
Redo Log 和 Undo Log 是 InnoDB 存储引擎提供的两个重要的日志机制,它们主要用于保证数据库的事务一致性和崩溃恢复。
-
Redo Log(重做日志):
- 作用:用于保证事务的持久性(Durability),即使在系统崩溃后,数据库仍然可以通过重做日志恢复未完成的事务。
- 原理:InnoDB 会先将事务的更改写入 Redo Log,然后再写入数据文件。即使系统崩溃,也可以通过 Redo Log 恢复数据库到事务提交时的状态。
-
Undo Log(回滚日志):
- 作用:用于实现事务的回滚和 MVCC(多版本并发控制)。当事务失败或被回滚时,Undo Log 可以撤销事务对数据的更改。
- 原理:每次事务操作前,InnoDB 会将数据的旧版本写入 Undo Log。如果事务失败,系统会利用 Undo Log 恢复数据。
Redo Log 和 Binary Log 的区别:
- Redo Log 记录的是物理层面的页修改,用于崩溃恢复,保证事务持久性。
- Binary Log 记录的是逻辑层面的 SQL 语句或数据变更,用于主从复制和数据恢复。
第七部分:MySQL 主从复制与集群
7.1 主从复制
主从复制 是 MySQL 中常用的高可用和数据同步机制,允许一个 MySQL 服务器(主库)将其数据更改同步到一个或多个从库。通过主从复制,可以实现读写分离、负载均衡以及数据冗余等功能。
-
主从复制的基本原理:
- 主库记录所有数据修改操作到二进制日志(Binlog)中。
- 从库通过 I/O 线程读取主库的二进制日志,并将其保存为中继日志(Relay Log)。
- 从库通过 SQL 线程读取中继日志中的 SQL 语句,并执行这些语句以达到与主库一致的状态。
-
主从复制的类型:
- 异步复制:主库将数据写入二进制日志后立即返回,不等待从库的确认。这种方式下,从库可能会有一定的延迟。
- 半同步复制:主库在写入二进制日志后,需要等待至少一个从库确认已收到日志,才返回给客户端。
- 全同步复制:主库只有在所有从库都确认收到日志后,才会返回给客户端。这种方式在网络延迟高或从库较多时性能较差。
-
搭建主从复制:
- 在主库中配置
log-bin
以开启二进制日志,并设置server-id
。 - 在从库中配置
server-id
,并通过CHANGE MASTER TO
指定主库的地址、用户和二进制日志的起始位置。 - 启动从库复制线程:
START SLAVE;
- 在主库中配置
7.2 主从延迟问题
主从延迟是指从库无法及时同步主库的数据更改,导致从库中的数据滞后于主库。常见的延迟原因包括:
- 网络延迟:主从之间的网络传输性能低下,会增加 I/O 线程读取二进制日志的时间。
- 从库的性能问题:如果从库的 CPU 或磁盘性能较差,SQL 线程可能无法及时执行主库传来的 SQL 语句。
- 主库负载过高:主库负载过高时,二进制日志的生成速度会超过从库的同步速度。
优化方法:
- 提高网络带宽,减少网络延迟。
- 升级从库的硬件资源,或配置多个从库分担读操作。
- 对主库进行性能优化,减少大批量数据更新操作的频率。
7.3 MySQL 集群
MySQL 集群是用于实现高可用性和高可扩展性的数据库解决方案,常见的 MySQL 集群架构包括:
-
MySQL Cluster:
- MySQL Cluster 是一种基于 NDB 存储引擎的分布式数据库架构,适合高可用、低延迟的实时应用。
- 特点:所有数据会被分布存储在多个节点中,支持无单点故障和自动故障恢复。
-
MHA(Master High Availability):
- MHA 是一种自动故障切换方案,当主库出现故障时,MHA 可以自动将某个从库提升为新的主库。
- 优点:MHA 提供了自动故障切换和数据恢复的功能,确保数据库的高可用性。
-
Galera Cluster:
- Galera Cluster 是一种同步多主复制的集群解决方案,支持多主写入,确保多个节点之间的数据一致性。
- 特点:Galera 通过组通信协议实现数据复制,适用于需要多主写入的场景。
第八部分:MySQL 高级面试问题
8.1 如何排查 MySQL 的性能问题?
性能问题排查 是 MySQL 面试中的高频考题,通常涉及以下几个工具和步骤:
-
Explain:分析 SQL 查询的执行计划,检查是否使用了索引,是否存在全表扫描。
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
-
慢查询日志:通过慢查询日志,识别出执行时间较长的 SQL 语句,并对其进行优化。
SET GLOBAL slow_query_log = 1; SET GLOBAL long_query_time = 1;
-
Show Profiles:用于查看每条查询的执行细节,包括 CPU 时间、IO 等。
SHOW PROFILES;
-
系统性能监控:结合系统级的性能工具(如
top
、iotop
、vmstat
)分析 CPU、内存、磁盘 IO 的瓶颈。
8.2 如何解决 MySQL 死锁问题?
-
通过 InnoDB 状态查看死锁:
SHOW ENGINE INNODB STATUS;
-
分析死锁原因:
- 分析锁定顺序,确保事务按相同的顺序请求锁,以避免交叉等待。
- 通过减少长事务或分解复杂查询,减少锁定的持续时间。
8.3 如何优化 MySQL 连接数问题?
在高并发场景下,MySQL 的连接数可能成为瓶颈。可以通过以下策略进行优化:
-
调整
max_connections
:增加 MySQL 的最大连接数限制。SET GLOBAL max_connections = 500;
-
使用连接池:通过连接池复用连接,避免频繁创建和关闭连接的开销。常见的连接池方案有 HikariCP、Druid 等。
-
优化长连接:使用长连接可以减少频繁的连接创建开销,但需要定期释放空闲连接,避免占用资源。
8.4 大数据量下如何提高查询性能?
-
表分区与分表策略:
- 对于大表,可以根据时间、范围等条件进行分区,或者将大表拆分为多个表,以提高查询性能。
-
使用覆盖索引:通过建立覆盖索引,减少回表操作。
SELECT id, email FROM users WHERE id > 1000;
-
优化分页查询:避免使用
OFFSET
较大的分页查询,改为基于主键或索引进行分页。SELECT * FROM users WHERE id > 10000 LIMIT 100;
总结
这本 MySQL 面试知识点手册从 MySQL 的基础知识、索引优化、事务与锁机制、存储引擎、性能优化、日志机制、主从复制与集群等多个方面,系统地介绍了 MySQL 的关键概念与高级操作技巧。通过掌握这些知识,读者可以更好地应对 MySQL 面试中的各种问题,同时具备在实际工作中优化和管理 MySQL 数据库的能力。
本手册强调了实践中的调优方法和问题排查策略,希望能帮助读者在面试中展现出扎实的 MySQL 技能,顺利通过技术考核。
相关文章:

MYSQL面试知识点手册
第一部分:MySQL 基础知识 1.1 MySQL 简介 MySQL 是世界上最流行的开源关系型数据库管理系统之一,它以性能卓越、稳定可靠和易用性而闻名。MySQL 主要应用在 Web 开发、大型互联网公司、企业级应用等场景,且广泛用于构建高并发、高可用的数据…...

排序算法的分析和应用
自己设计一个长度不小于10的乱序数组,用希尔排序,自己设定希尔排序参数 画出每一轮希尔排序的状态 自己设计一个长度不小于10的乱序数组,用堆排序,最终要生成升序数组,画出建堆后的状态 画出每一轮堆排序的状态 自…...

iptables限制网速
1、使用hashlimit来限速 #从eth0网卡进入INPUT链数据,使用模块hashlimit 限制网速为100kb/s或2mb/s,超过限制的数据包会被DROP。OUTPUT链同理,mode为srcip,有4个mode选项: srcip(默认匹配每个源地址IP,配置指定源地址…...

ALSA ubuntu 编译
1、下载tar包:alsa-lib、alsa-utils GitHub - alsa-project/alsa-lib: The Advanced Linux Sound Architecture (ALSA) - library(核心库) GitHub - alsa-project/alsa-utils: The Advanced Linux Sound Architecture (ALSA) - utilities(工具库) 2、…...

【学习笔记】SSL/TLS证书安全机制之证书透明
1、概念 CT - Certificate Transparency,证书透明 2、Trying to Solve 如果意外的 CA 为我们的域名颁发证书,我们是不可见,这就是证书透明(CT)要解决的问题 3、How CT Works 任何CA机构颁发的所有证书的公共登记处&…...

网络编程问题解答
TCP/IP是哪种模型的协议 TCP/IP 是一组通信协议的集合,它基于 TCP/IP 模型。TCP/IP 模型通常被认为是一种实用的网络通信模型,与 OSI 模型相比,TCP/IP 模型更加简洁和侧重于实际应用,被广泛应用于互联网和大多数计算机网络中。 T…...

【开源免费】基于SpringBoot+Vue.JS服装商城系统(JAVA毕业设计)
本文项目编号 T 046 ,文末自助获取源码 \color{red}{T046,文末自助获取源码} T046,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…...

C语言字符串学习
在C语言中,字符串(String)是字符数组(character array),并且它以空字符(\0)结束,表示字符串的结尾。我们可以通过一些常见的操作和概念来详细理解它。 1. 字符串的概念 …...

当你在Linux系统中使用MySQL命令行工具查询数据库时,如果中文显示为问号(?)或其他乱码,简单解决办法。(2)
文章目录 1、问题出现2、解决办法 1、问题出现 2、解决办法 mysql -u [username] -p --default-character-setutf8 [database_name]rootab66508d9441:/# mysql -uroot -p123456 --default-character-setutf8 tingshu_album mysql: [Warning] Using a password on the command …...

API网关之Fizz Gateway
Fizz Gateway 是一款轻量级、高性能的 API 网关,专门为服务间通信、流量控制、请求路由、鉴权与认证等需求而设计。它旨在为分布式系统和微服务架构提供高效的请求处理能力,帮助开发者构建和管理 API 服务。 核心特性 1. 请求路由 Fizz Gateway 通过强…...

pgvector docker版安装;稀疏向量使用;psycopg2 python连接使用
参看: https://cloud.tencent.com/developer/article/2359831 https://hub.docker.com/r/pgvector/pgvector/tags https://github.com/pgvector/pgvector 一、安装 拉取0.7版本 docker pull pgvector/pgvector:0.7.4-pg16运行: docker run --name pgvector -v $(pwd)/dat…...

C#命令行参数解析库System.CommandLine介绍
命令行参数 平常在日常的开发过程中,会经常用到命令行工具。如cmd下的各种命令。 以下为sc命令执行后的截图,可以看到,由于没有输入任何附带参数,所以程序并未执行任何操作,只是输出了描述和用法。 系统在创建一个新…...

CCF CSP题解:密码(key)(202409-1)
题目和思路 题目背景 西西艾弗网对用户密码有一套安全级别评定标准。 题目描述 在西西艾弗网上,用户的密码是一个由大写字母(A‐Z)、小写字母(a‐z)、数字(0‐9)和特殊字符(*和 …...

RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案
RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案 🛠️ RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案摘要 📃引言 ✨1. 什么是递归?🔍1.1 递归的基本概念 &#x…...

Linux1-ls,cd,pwd
1.Linux操作系统的根目录用/表示。 Windows操作系统的根目录有D:E: 2.Linux命令格式 命令 [选项] [参数] 例如:ls -l / ls表示显示文件夹内容 -l表示以列表的形式展示 /表示显示的是根目录文件夹的内容 其中,[]里面的内容可省略ÿ…...

【高级编程】XML DOM4J解析XML文件(含案例)
文章目录 DOM4JDOM4J 解析 XML读取修改添加删除 XML(EXtensible Markup Language),可扩展标记语言。一种用于存储和传输数据的标记语言。XML 与操作系统、编程语言的开发平台无关。实现不同系统之间的数据交换。 作用:数据交互&a…...

查看VSFTPD配置的服务器路径和linux系统有哪些用户
要查看VSFTPD (Very Secure FTP Daemon)配置中定义的服务器路径,需要检查VSFTPD的配置文件。这通常可以在配置文件中找到并有不同的选项来设置路径。 这里有几个方法可以查看配置的服务器路径: 1. 检查主配置文件 VSFTPD的默认配置文件通常位于`/etc/vsftpd.conf`。可以使用…...

JavaEE: 创造无限连接——网络编程中的套接字
文章目录 Socket套接字TCP和UDP的区别有连接/无连接可靠传输/不可靠传输面向字节流/面向数据报全双工/半双工 UDP/TCP api的使用UDPDatagramSocketDatagramPacketInetSocketAddress练习 TCPServerSocketSocket练习 Socket套接字 Socket是计算机网络中的一种通信机制࿰…...

记K8s组件harbor和kuboard故障恢复
#记录一次工作实践# 故障现象: 本地私有仓库harbor和控制台kuboard均无法正常登陆。 解决过程: 1、harbor恢复过程 通过docker ps -a |grep harbor查看harbor相关的容器状态,发现均显示启动状态,但是仓库无法访问。 通过doc…...

c++ return {};
https://segmentfault.com/q/1010000042734336 return {}; 表示“返回一个用空 列表初始化器 初始化的函数返回类型的对象”。确切的行为取决于返回对象的类型。 std::string get_string() {return {}; // an empty string is returned }...

【设计模式-适配】
Adapter Pattern(适配器模式) 是一种结构型设计模式,其主要目的是让不兼容的接口能够协同工作。适配器模式通过引入一个适配器类,转换一个类的接口,使得原本不兼容的接口可以互相配合,从而实现接口的兼容性…...

深度学习02-pytorch-08-自动微分模块
其实自动微分模块,就是求相当于机器学习中的线性回归损失函数的导数。就是求梯度。 反向传播的目的: 更新参数, 所以会使用到自动微分模块。 神经网络传输的数据都是 float32 类型。 案例1: 代码功能概述: 该…...

使用Python实现深度学习模型:智能宠物监控与管理
在现代家庭中,宠物已经成为许多家庭的重要成员。为了更好地照顾宠物,智能宠物监控与管理系统应运而生。本文将详细介绍如何使用Python实现一个智能宠物监控与管理系统,并结合深度学习模型来提升其功能。 一、准备工作 在开始之前,我们需要准备以下工具和材料: Python环境…...

【HTTPS】对称加密和非对称加密
HTTPS 是什么 HTTPS 是在 HTTP 的基础上,引入了一个加密层(SSL)。HTTP 是明文传输的(不安全) 当下所见到的大部分网站都是 HTTPS 的,这都是拜“运营商劫持”所赐 运营商劫持 下载⼀个“天天动听“&…...

MySQL中的LIMIT与ORDER BY关键字详解
前言 众所周知,LIMIT和ORDER BY在数据库中,是两个非常关键并且经常一起使用的SQL语句部分,它们在数据处理和分页展示方面发挥着重要作用。 今天就结合工作中遇到的实际问题,回顾一下这块的知识点。同时希望这篇文章可以帮助到正…...

Java 编码系列:集合框架(List、Set、Map 及其常用实现类)
引言 在 Java 开发中,集合框架是不可或缺的一部分,它提供了存储和操作一组对象的工具。Java 集合框架主要包括 List、Set 和 Map 接口及其常用的实现类。正确理解和使用这些集合类不仅可以提高代码的可读性和性能,还能避免一些常见的错误。本…...

Go进阶概览 -【7.2 泛型的使用与实现分析】
7.2 泛型的使用与实现分析 泛型是Go 1.18引入的概念,在引入这个概念前经过了好几年的考量最终才将这这个特性加进去。 泛型在多种语言中都是存在的,比如C、Java等语言中都有泛型的概念。 本节我们将针对泛型的使用、实现原理进行整体的讲解。 本节代…...

罗德岛战记游戏源码(客户端+服务端+数据库+全套源码)游戏大小9.41G
罗德岛战记游戏源码(客户端服务端数据库全套源码)游戏大小9.41G 下载地址: 通过网盘分享的文件:【源码】罗德岛战记游戏源码(客户端服务端数据库全套源码)游戏大小9.41G 链接: https://pan.baidu.com/s/1y0…...

AI+教育|拥抱AI智能科技,让课堂更生动高效
AI在教育领域的应用正逐渐成为现实,提供互动性强的学习体验,正在改变传统教育模式。AI不仅改变了传统的教学模式,还为教育提供了更多的可能性和解决方案。从个性化学习体验到自动化管理任务,AI正在全方位提升教育质量和效率。随着…...

WebServer
一、服务器代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <unistd.h> #define PORT 80 #define BUFFER_SIZE 1024 void ha…...