【2025年】MySQL面试题总结
文章目录
- 1. MySQL 支持哪些存储引擎?默认使⽤哪个?
- 2. MyISAM 和 InnoDB 有什么区别?
- 3. 事务的四大特性?
- 4. 并发事务带来了哪些问题?
- 5. 不可重复读和幻读有什么区别?
- 6. MySQL 事务隔离级别?默认是什么级别?
- 7. MySQL 的隔离级别是基于锁实现的吗?
- 8. InnoDB 对 MVCC 的具体实现
- 9. char 和 varchar 的区别是什么?
- 10. varchar(100)和 varchar(10)的区别是什么?
- 11. decimal 和 float/double 的区别是什么?存储⾦钱应该⽤哪⼀种?
- 12. 为什么索引能提高查询速度?
- 13. 为什么MySQL不建议使用NULL作为列默认值?
- 14. 聚集索引和非聚集索引的区别?非聚集索引⼀定回表查询吗?
- 15. 索引这么多优点,为什么不对表中的每一个列创建一个索引呢?(使用索引一定能提高查询性能吗?)
- 16. 索引底层的数据结构了解吗?Hash 索引和 B+树索引优劣分析
- 17. B+树做索引比红黑树好在哪里?
- 18. 最左前缀匹配原则了解吗?
- 19. 什么是覆盖索引?
- 20. 什么是回表?
- 21. 如何查看某条 SQL 语句是否用到了索引?
- 22. 表级锁和行级锁有什么区别?
- 23. 哪些操作会加表级锁?哪些操作会加行级锁?
- 24. MySQL中有哪些类型的锁?
- 25. 当前读和快照读有什么区别?
- 26. 乐观锁和悲观锁是什么?
- 27. MySQL自增主键一定是连续的吗?
- 28. MySQL 中常见的日志有哪些?
- 29. 数据库的三大范式是什么
- 30. 慢查询日志有什么用?
- 31. binlog 主要记录了什么?
- 32. binlog 和 redolog 有什么区别?
- 33. redolog 什么情况下会出现数据丢失
- 34. 如何保证redolog 和 binlog的一致性
- 35. undo log 如何保证事务的原子性?
- 36. binlog 有哪几种记录格式
- 37. 如何进行SQL调优
- 38. 如何实现读写分离?
- 39. 什么是MySQL的主从同步机制
- 40. 什么是分库分表
- 41. MySQL获取数据,是从磁盘读取的吗?
- 42. 什么情况下,不推荐为数据库建立索引?
- 43. 如何在MySQL中监控和优化慢SQL
内容参考:
https://javaguide.cn
、
https://t.zsxq.com/0bWeUrBVq
、
https://www.mianshiya.com
1. MySQL 支持哪些存储引擎?默认使⽤哪个?
MySQL 5.5.5 之前,MyISAM 是 MySQL 的默认存储引擎。5.5.5 版本之后,InnoDB 是 MySQL 的默认存储引擎。
MySQL支持的存储引擎中只有 InnoDB 是事务性存储引擎,也就是说只有 InnoDB 支持事务。
2. MyISAM 和 InnoDB 有什么区别?
-
InnoDB 支持行级别的锁粒度,MyISAM 不支持,只支持表级别的锁粒度。
-
MyISAM 不提供事务支持。InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别。
-
MyISAM 不支持外键,而 InnoDB 支持。
-
MyISAM 不支持 MVCC,而InnoDB 支持。
-
虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree作为索引结构,但是两者的实现方式不太一样。
InnoDB 引擎中,其数据文件本身就是索引文件。相比 MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶节点 data 域保存了完整的数据记录。
-
MyISAM 不支持数据库异常崩溃后的安全恢复,而 InnoDB 支持。
-
InnoDB 的性能比MyISAM 更强大。
3. 事务的四大特性?
原子性(Atomicity)
:事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;一致性(Consistency)
:执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;隔离性(Isolation)
:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;持久性(Durability)
:一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。
4. 并发事务带来了哪些问题?
1) 脏读
事务A读取了事务B未提交的修改,随后事务B回滚,导致事务A读到的数据是无效的(“脏数据”)。
2) 丢失修改
在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。
3) 不可重复读
事务A多次读取同一数据,期间事务B提交了修改,导致事务A两次读取结果不一致(针对已存在数据的修改)。
4) 幻读
幻读与不可重复读类似。它发生在一个事务读取了几行数据,接着另一个并发事务插入了一些数据时。在随后的查询中,第一个事务就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
例如:事务 2 读取某个范围的数据,事务 1 在这个范围插入了新的数据,事务 2 再次读取这个范围的数据发现相比于第一次读取的结果多了新的数据。
5. 不可重复读和幻读有什么区别?
对比维度 | 不可重复读 | 幻读 |
---|---|---|
操作对象 | 已存在的单行数据(值变化) | 满足条件的多行数据(行数变化) |
触发操作 | UPDATE、DELETE | INSERT、DELETE |
表现形式 | 同一行数据的值不同 | 结果集的行数不同 |
6. MySQL 事务隔离级别?默认是什么级别?
READ-UNCOMMITTED(读取未提交)
:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。READ-COMMITTED(读取已提交)
:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。REPEATABLE-READ(可重复读)
默认
:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。SERIALIZABLE(可串行化)
:最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ-UNCOMMITTED | √ | √ | √ |
READ-COMMITTED | × | √ | √ |
REPEATABLE-READ | × | × | √ |
SERIALIZABLE | × | × | × |
7. MySQL 的隔离级别是基于锁实现的吗?
是基于锁
和MVCC
共同实现的,MVCC主要是解决读和写两种操作之间的冲突,提高并发事务的处理速度
写与写之间的冲突还是要加锁来解决,只不过在不同的隔离级别下加的锁不同
读(普通的 select)和写之间的冲突在RC和RR隔离级别下依靠MVCC快照读
解决了
另一类 SELECT... FOR UPDATE
、SELECT ... LOCK IN SHARE MODE
在RU、RC会加行锁,在RR、S隔离级别加临键锁(Next-Key Lock,行锁 + 间隙锁)
SELECT... FOR UPDATE
的行锁是X锁,SELECT ... LOCK IN SHARE MODE
的行锁是S锁
这种是显式上锁的读(主要目的是显式上锁),都是当前读,UPDATE和DELETE都会隐式上锁,那为啥有隐式上锁还要有显式上锁呢?假设我们读取账号余额(必须保证读取的数据是最新的,在扣减余额的时候不能被其他事务影响),如果没有显示上锁,我们只能直接通过UPDATE/DELETE上锁,但是我都不知道账户余额够不够扣减的,直接执行UPDATE肯定不行,如果没有显示上锁,先通过普通select查询余额,发现余额够,然后去执行UPDATE,在这之间,余额被其他并发事务扣过一次了,结果当前事务在发现余额够的情况下扣减余额成负的了,这显然不合理
隔离级别 | 锁的参与 | MVCC 的参与 | 解决的问题 |
---|---|---|---|
读未提交(RU) | 写操作加排他锁,读操作无锁 | ❌ 不使用 | 无(脏读、不可重复读、幻读) |
读已提交(RC) | 写操作加排他锁 | ✅ 每次 SELECT 生成新快照 | 脏读 |
可重复读(RR) | 写操作加排他锁 + 间隙锁 | ✅ 使用事务开始时的快照 | 脏读、不可重复读、幻读(InnoDB) |
串行化(S) | 所有操作加共享锁/排他锁 | ❌ 不使用 | 所有并发问题(但性能差) |
8. InnoDB 对 MVCC 的具体实现
InnoDB 的 MVCC 通过隐藏字段(事务ID和回滚指针)、Undo Log 版本链和 Read View 实现读写并发控制。在内部实现中,InnoDB 通过数据行的 事务ID
和 Read View
来判断数据的可见性,如不可见,则通过数据行的 回滚指针
找到 undo log 中的历史版本。每个事务读到的数据版本可能是不一样的,在同一个事务中,用户只能看到该事务创建 Read View 之前已经提交的修改和该事务本身做的修改
9. char 和 varchar 的区别是什么?
主要区别:CHAR 是定长字符串,VARCHAR 是变长字符串。
CHAR 在存储时会在右边填充空格以达到指定的长度,检索时会去掉空格;
VARCHAR 在存储时需要使用 1 或 2 个额外字节记录字符串的长度,检索时不需要处理。
CHAR(M) 和 VARCHAR(M) 的 M 都代表能够保存的字符数的最大值,
无论是字母、数字还是中文,每个都只占用一个字符。
10. varchar(100)和 varchar(10)的区别是什么?
VARCHAR(100)和 VARCHAR(10)都是变长类型,表示能存储最多 100 个字符和 10 个字符。
VARCHAR(100)和 VARCHAR(10)能存储的字符范围不同,但二者存储相同的字符串,所占用磁盘的存储空间其实是一样的。
不过,VARCHAR(100) 会消耗更多的内存。这是因为 VARCHAR 类型在内存中操作时,通常会分配固定大小的内存块来保存值,即使用字符类型中定义的长度。
11. decimal 和 float/double 的区别是什么?存储⾦钱应该⽤哪⼀种?
DECIMAL 是定点数,FLOAT/DOUBLE 是浮点数。DECIMAL 可以存储精确的小数值,FLOAT/DOUBLE 只能存储近似的小数值。
DECIMAL 用于存储具有精度要求的小数,例如与货币相关的数据,可以避免浮点数带来的精度损失。
12. 为什么索引能提高查询速度?
无索引时
:数据库需要逐行扫描整个表(全表扫描),时间复杂度为 O(n)。
有索引时
:通过特定的数据结构(如 B+Tree)预先组织数据,查询时只需扫描索引结构(如 B+Tree 的高度通常很小),时间复杂度降低到 O(log n)。帮助数据库快速定位到目标数据的位置,避免全表扫描。例如,2000 万行数据的 B+Tree 索引可能只需 3-4 次磁盘 I/O 即可定位数据。
分析:每个数据页16KB,假设是聚簇索引,key和指针占16B(非叶节点),key和数据占1KB(叶节点),一个三层的B+树,可以存1000*1000*16条数据,定位这1600万条数据只需要3次IO
13. 为什么MySQL不建议使用NULL作为列默认值?
- 唯一索引(UNIQUE)允许多个NULL值(除非显式声明NOT NULL),可能导致逻辑歧义。
- 索引中的NULL值会降低查询效率。例如,WHERE column IS NULL可能无法有效利用索引,而NOT NULL列可通过索引直接定位数据。
- COUNT(column)会忽略NULL值,而COUNT(*)统计所有行。若列允许NULL,统计结果可能不符合预期。
- 在用=,!= 比较时,开发者需额外注意IS NULL/IS NOT NULL的用法,否则易引发逻辑错误。
14. 聚集索引和非聚集索引的区别?非聚集索引⼀定回表查询吗?
聚簇索引(聚集索引)
:索引结构和数据一起存放的索引,InnoDB 中的主键索引就属于聚簇索引。
非聚簇索引(非聚集索引)
:索引结构和数据分开存放的索引,二级索引(辅助索引)就属于非聚簇索引。二级索引的叶子节点存放的是主键,根据主键再回表查数据。
二级索引(辅助索引)属于非聚簇索引。MySQL 的 MyISAM 引擎,不管主键还是非主键,使用的都是非聚簇索引。
非聚簇索引不一定回表查询。如果要查询的数据正好是非聚簇索引的key,就无需回表查询。
聚簇索引和非聚簇索引的区别:
15. 索引这么多优点,为什么不对表中的每一个列创建一个索引呢?(使用索引一定能提高查询性能吗?)
大多数情况下,索引查询都是比全表扫描要快的。但是如果数据库的数据量不大,那么使用索引也不一定能够带来很大提升。因为:
- 创建和维护索引需要耗费许多时间。当对表中的数据进行增删改的时候,如果数据有索引,那么索引也需要动态地修改,这会降低 SQL 执行效率。
- 索引需要使用物理文件存储,也会耗费一定空间。
16. 索引底层的数据结构了解吗?Hash 索引和 B+树索引优劣分析
索引的底层数据结构通常有两种常见实现:B+树和哈希表。
B+树是一种多路平衡查找树,它的内部节点仅存储键值和指向子节点的指针,而叶子节点存储实际数据或指向数据的指针,叶子节点之间通过链表连接,这使得B+树天然支持高效的范围查询和顺序访问。比如数据库中的范围查询(如WHERE age > 20)或排序操作(ORDER BY)可以直接通过遍历叶子节点的链表完成,同时B+树的树高较低,能减少磁盘I/O次数,非常适合磁盘存储的场景,这也是为什么像MySQL的InnoDB引擎默认使用B+树索引的原因。
而哈希索引基于哈希表实现,通过哈希函数将键值映射到固定桶中,理想情况下查询时间复杂度为O(1),等值查询(如WHERE id = 123)非常高效。但它不支持范围查询,因为数据是无序存储的,例如WHERE age BETWEEN 10 AND 20需要全表扫描。
17. B+树做索引比红黑树好在哪里?
B+树通过多路平衡结构(每个节点可容纳大量键值)大幅降低树高,使得百万级数据仅需3-4层即可覆盖,显著减少磁盘I/O次数;其叶子节点形成有序链表,使得范围查询无需回溯中间节点即可线性遍历,而红黑树作为二叉树在相同数据量下树高更高且范围查询需复杂遍历。同时,B+树的节点大小与磁盘页对齐,单次I/O能加载更多有效数据,且插入/删除操作引发的节点分裂合并具有更好的局部性,减少了随机磁盘访问,而红黑树的旋转操作可能导致分散的磁盘写入(因为要修改父节点或者兄弟节点的指针,他们的数据可能存在不同的数据块中,要分散读取到内存中)。
18. 最左前缀匹配原则了解吗?
最左前缀匹配原则指的是在使用联合索引时,MySQL 会根据索引中的字段顺序,从左到右依次匹配查询条件中的字段。如果查询条件与索引中的最左侧字段相匹配,那么 MySQL 就会使用索引来过滤数据,这样可以提高查询效率。
最左匹配原则会一直向右匹配,直到遇到范围查询(如 >、<)为止。对于 >=、<=、BETWEEN 以及前缀匹配 LIKE 的范围查询,不会停止匹配
19. 什么是覆盖索引?
如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称之为 覆盖索引。覆盖索引即需要查询的字段正好是索引的字段,那么直接根据该索引,就可以查到数据了,而无需回表查询。
20. 什么是回表?
在 InnoDB 存储引擎中,非主键索引的叶子节点包含的是主键的值。这意味着,当使用非主键索引进行查询时,数据库会先找到对应的主键值,然后再通过主键索引来定位和检索完整的行数据。这个过程被称为“回表”。
21. 如何查看某条 SQL 语句是否用到了索引?
我们可以使用 EXPLAIN 命令来分析 SQL 的 执行计划 ,这样就知道语句是否命中索引了。执行计划是指一条 SQL 语句在经过 MySQL 查询优化器的优化会后,具体的执行方式。EXPLAIN 并不会真的去执行相关的语句,而是通过 查询优化器 对语句进行分析,找出最优的查询方案,并显示对应的信息。
22. 表级锁和行级锁有什么区别?
表级锁
: MySQL 中锁定粒度最大的一种锁(全局锁除外),一般是用来针对非索引字段加的锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。不过,触发锁冲突的概率最高,高并发下效率极低。表级锁和存储引擎无关,MyISAM 和 InnoDB 引擎都支持表级锁。
行级锁
: MySQL 中锁定粒度最小的一种锁,一般是针对索引字段加的锁 ,只针对当前操作的行记录进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。行级锁和存储引擎有关,是在存储引擎层面实现的。
23. 哪些操作会加表级锁?哪些操作会加行级锁?
表级锁
:
- DDL 操作
修改表结构时(如 ALTER TABLE、DROP TABLE、TRUNCATE TABLE)会加表级锁。 - 显式锁表
使用 LOCK TABLES 命令显式锁定表。 - MyISAM 引擎的读写
MyISAM 默认对写操作加表级排他锁,读操作加表级共享锁。 - 无索引的更新(InnoDB 锁升级)
如果 UPDATE/DELETE 未使用索引,InnoDB 可能升级为表级锁。
行级锁
:
- 事务中的写操作(InnoDB)
UPDATE、DELETE 默认对符合条件的行加排他锁(X 锁)。 - 显式行级锁查询
SELECT … FOR UPDATE 加排他锁,SELECT … LOCK IN SHARE MODE 加共享锁。
24. MySQL中有哪些类型的锁?
行级锁
:仅对特定的行加锁,允许其他事务并发访问不同的行,适用于高并发场景。
表级锁
:对整个表加锁,其他事务无法对该表进行任何读写操作,适用于需要保证完整性的小型表。
共享锁
:允许多个事务并发读取同一资源,但不允许修改。只有在释放共享锁后,其他事务才能获得排它锁。
排他锁
:只允许一个事务对资源进行读写,其他事务在获得排它锁之前无法访问该资源。
间隙锁
:针对索引中两个记录之间的间隙加锁,防止其他事务在这个间隙中插入新记录,以避免幻读。间隙锁不锁定具体行,而是锁定行与行之间的空间。
临键锁
:是行级锁和间隙锁的结合,锁定具体行和其前面的间隙,确保在一个范围内不会出现幻读。常用于支持可重复读的隔离级别。
意向锁
:一种表锁,用于表示某个事务对某行数据加锁的意图,分为意向共享锁(IS)和意向排它锁(IX),主要用于行级锁与表级锁的结合。
插入意向锁
:一种特殊的间隙锁(Gap Lock),允许不同事务在同一个间隙的不同位置并发插入数据,从而减少锁冲突。
25. 当前读和快照读有什么区别?
主要区别就是在于读的时候锁不锁定
快照读(一致性非锁定读)
就是普通的 SELECT 语句
只有在事务隔离级别 RC(读取已提交) 和 RR(可重读)下,InnoDB 才会使用一致性非锁定读:
- 在 RC 级别下,对于快照数据,一致性非锁定读总是读取被锁定行的最新一份快照数据。
- 在 RR 级别下,对于快照数据,一致性非锁定读总是读取本事务开始时的行数据版本。
当前读 (一致性锁定读)
就是给行记录加 X 锁或 S 锁
# 对读的记录加一个X锁
SELECT...FOR UPDATE
# 对读的记录加一个S锁
SELECT...LOCK IN SHARE MODE#(旧版,已弃用)
# 对读的记录加一个S锁
SELECT...FOR SHARE#(新版)
# 对修改的记录加一个X锁
INSERT...
UPDATE...
DELETE...
26. 乐观锁和悲观锁是什么?
悲观锁
:
假设并发冲突一定会发生,因此在操作数据前先加锁,确保操作过程中数据不会被其他事务修改。
实现方式
- 数据库内置锁机制:如行锁、表锁、共享锁(S锁)、排他锁(X锁)。
乐观锁
假设并发冲突很少发生,因此不加锁直接操作数据,仅在提交时检查数据是否被修改。若冲突则重试或报错。
实现方式
- 版本号机制:通过版本号或时间戳标记数据版本。
- CAS(Compare and Swap):原子操作更新数据前检查当前值是否符合预期。
27. MySQL自增主键一定是连续的吗?
详细分析:https://javaguide.cn/database/mysql/mysql-auto-increment-primary-key-continuous.html
不一定,在以下情况可能不连续:
- 自增初始值和自增步长设置不为 1
- 唯一键冲突
- 事务回滚
- 批量插入(如 insert…select 语句)
28. MySQL 中常见的日志有哪些?
MySQL中常见的日志主要包括错误日志、通用查询日志、慢查询日志、二进制日志(Binlog)
、事务日志(Redo Log 和 Undo Log)
、中继日志以及DDL日志。
二进制日志(Binlog)记录了所有对数据的修改操作,支持主从复制和数据恢复,是实现高可用架构的基础。
事务日志中的Redo Log确保事务的持久性,崩溃恢复时重放未落盘的操作,而Undo Log保存事务前的数据快照,支持回滚和MVCC机制。
29. 数据库的三大范式是什么
- 1NF(第一范式):属性不可再分。
- 2NF(第二范式):2NF 在 1NF 的基础之上,消除了非主属性对于码的部分函数依赖。
- 3NF(第三范式):3NF 在 2NF 的基础之上,消除了非主属性对于码的传递函数依赖 。
30. 慢查询日志有什么用?
慢查询日志主要是用来帮我们揪出数据库里那些执行特别慢的SQL语句,比如有时候系统突然卡了或者用户反馈页面加载慢,这时候就可以去翻翻慢查询日志,看看是不是哪条查询拖了后腿。比如说,如果一条SQL执行了十几秒甚至更久,它会被自动记录到日志里,这样我们就能快速定位到问题语句,而不是像大海捞针一样去排查整个系统。
31. binlog 主要记录了什么?
Binlog(二进制日志)可以理解为数据库的“操作流水账”,它主要记录了MySQL服务器运行期间所有对数据库结构或数据产生修改的操作,比如插入、更新、删除这些写动作。
这样一来,binlog就有了两个核心用途:一个是主从复制,从库可以通过拉取主库的binlog来逐条重放这些操作,保持数据同步;另一个是数据恢复,比如哪天误删了数据或者数据库崩溃,可以通过binlog“回放”某个时间点之后的所有操作,把数据追到最新状态。
32. binlog 和 redolog 有什么区别?
binlog主要用于数据库还原,属于数据级别的数据恢复,主从复制是binlog最常见的一个应用场景。redolog主要用于保证事务的持久性,属于事务级别的数据恢复。
33. redolog 什么情况下会出现数据丢失
- redolog写入log buffer但还未写入page cache,此时数据库崩溃,就会出现数据丢失;
- redolog已经写入pagecache但还未写入磁盘,操作系统奔溃,也可能出现数据丢失。
34. 如何保证redolog 和 binlog的一致性
InnoDB用两阶段提交来保证Redolog和Binlog的一致性。事务提交时,先写Redolog到prepare状态,再写Binlog,最后把Redolog标记为commit。这样如果中途崩溃,重启时会检查Binlog是否完整——如果Binlog有记录,就说明事务应该提交,用Redolog恢复数据;如果Binlog没记录,就回滚事务。这样避免了主从库数据不一致或者恢复后数据错乱的问题。
35. undo log 如何保证事务的原子性?
Undo log通过记录事务执行前的数据状态来确保原子性。在事务执行过程中,每一条修改数据的操作都会生成对应的undo log记录,这些记录保存了数据修改前的原始值。如果事务在执行期间遇到错误或被显式回滚,数据库系统会依据undo log中的逆向操作链条,逐条撤销已完成的修改,将数据恢复到事务开始前的状态。
36. binlog 有哪几种记录格式
statement
指定statement,记录的内容是SQL语句原文。row
(5.7之后默认)
直接记录数据变化mixed
对上述两种方式的折中,默认情况下记录SQL语句(STATEMENT模式),但当检测到可能引发数据歧义的操作(如使用不确定函数或触发器)时,自动切换为ROW格式记录具体的数据变更。
37. 如何进行SQL调优
平时进行SQL调优,主要是通过观察慢SQL,然后利用explain分析查询语句的执行计划,识别性能瓶颈,优化查询语句。
- 合理设计索引,利用联合索引进行覆盖索引的优化,避免回表的发生,减少一次查询和随机I/O
- 避免SELECT*,只查询必要的字段
- 避免在SQL中进行函数计算等操作,使得无法命中索引
- 避免使用LIKE %,导致全表扫描
- 注意联合索引|需满足最左匹配原则
- 不要对无索引字段进行排序操作
- 连表查询需要注意不同字段的字符集是否一致,否则也会导致全表扫描
除此之外,还可以利用缓存来优化,一些变化少或者访问频繁的数据设置到缓存中,减轻数据库的压力,提升查询的效率。
还可以通过业务来优化,例如少展示一些不必要的字段,减少多表查询的情况,将列表查询替换成分页分批查询等等。
38. 如何实现读写分离?
读写分离就是读操作和写操作从以前的一台服务器上剥离开来,将主库压力分担一些到从库。本质上是因为访问量太大,主库的压力过大,单机数据库无法支撑并发读写。然后一般而言读的次数远高于写,因此将读操作分发到从库上,这就是常见的读写分离。
读写分离时可以让主库不建查询的索引,从库建查询的索引。
因为索引是需要维护的,比如你插入一条数据,不仅要在聚簇索引上面插入,对应的二级索引也得插入,修改也是一样的。所以将读操作分到从库了之后,可以在主库把查询要用的索引删了,减少写操作对主库的影响。
39. 什么是MySQL的主从同步机制
MySQL的主从同步机制是一种数据复制技术,用于将主数据库(Master)上的数据同步到一个或多个从数据库(Slave)中。
主要是通过二进制日志(BinaryLog,简称binlog)实现数据的复制。主数据库在执行写操作时,会将这些操作记录到binlog中,然后推送给从数据库,从数据库重放对应的日志即可完成复制。
40. 什么是分库分表
分库分表是数据库性能优化的一种方法,通过将数据分散存储在多个数据库或表中,来提高系统的可扩展性、性能和可用性。
分库分表的类型(或策略)包括:
1)水平分表:
将同一张表的数据按行划分,分散到多个表中。例如,可以按用户ID的范围将数据分为多个表(如user_1、user_2)。
2)垂直分表:
将一张表的不同列拆分到多个表中,以减少每张表的字段数量和提高查询效率。例如,用户表可以分为基本信息表和详细信息表。
3)水平分库:
将相同的表结构复制一份到另一个库中,每个库的表结构是一样的,可以减少单一数据库的读写压力,在大数量的情况下提高读写性能。例如,database1、database2。
4)垂直分库:
将数据分散到不同的数据库实例中。可以根据业务功能或模块进行分库,如将用户数据、订单数据分别存储在不同的数据库中。
41. MySQL获取数据,是从磁盘读取的吗?
在MySQL中,获取数据并不总是直接从磁盘读取。MySQL使用缓存机制,比如InnoDB存储引擎,会将常用的数据和索引缓存在内存中,以提高读取性能。当查询数据时,系统首先会检查缓存(如缓冲池),如果数据存在于内存中,则直接从内存中读取;如果不在,则会从磁盘读取并加载到缓存中。
42. 什么情况下,不推荐为数据库建立索引?
1)对于数据量很小的表
当表的数据量很小(如几百条记录)时,建立索引并不会显著提高查询性能,反而可能增加管理的复杂性。
2)频繁更新的表
对于频繁进行插入、更新和删除操作的表,索引会导致额外的维护开销,因为每次数据变更时都需要更新索引,这会影响性能。
3)低选择性字段(高度重复值的列)
当索引字段的取值重复度高(如性别字段“男”、“女”),索引的效果不明显,且会增加存储空间的浪费。
4) 长文本字段
会影响每个数据页存放key的数量,导致B+树变高,磁盘IO次数变多
43. 如何在MySQL中监控和优化慢SQL
可以利用MySQL自带的slow_query_log来监控慢SQL,它是MySQL提供的一个日志功能,用于记录执行时间超过特定阈值的SQL语句。
对于慢查询,再使用EXPLAIN分析执行计划,查看查询的执行顺序、使用的索引、扫描的行数等,以识别潜在的性能瓶颈。
相关文章:
【2025年】MySQL面试题总结
文章目录 1. MySQL 支持哪些存储引擎?默认使⽤哪个?2. MyISAM 和 InnoDB 有什么区别?3. 事务的四大特性?4. 并发事务带来了哪些问题?5. 不可重复读和幻读有什么区别?6. MySQL 事务隔离级别?默认是什么级别࿱…...
Python 数据智能实战 (10):智能商品推荐 - LLM “猜你喜欢”
写在前面 —— 从协同过滤到语义理解:融合 LLM,打造更懂用户心意的个性化推荐 在之前的篇章里,我们已经见证了 LLM 在用户分群、购物篮分析、流失预测、内容生成等多个电商环节的赋能潜力。今天,我们将聚焦于电商平台的“心脏”之一,也是用户体验和商业转化的核心驱动力…...
2025年 蓝桥杯省赛 Python A 组题目
文章目录 A.偏蓝B.IPv6C.2025图形D.最大数字E.倒水F.拼好数G.登山H.原料采购 近期复盘一下 省赛的题目,正所谓知不足方能进步可以在洛谷找到比赛的题目,不过得注意由于python版本的问题,有些代码想要在洛谷上ac的话,需要对应调整代…...
shell(7)
运算符 1.基本介绍 这是shell进行运算的符号,依靠这些标识才能实现我们在脚本中的运算. 2.基本语法 1、$((运算符))或$[运算符]或expr m n 注意: expr运算符间有空格→如果不加空格会被当做一个整体不会进行运算 例子: 3.expr m - n,如果要将expr运算…...
LangChain与MCP:大模型时代的工具生态之争与协同未来
LangChain与MCP:大模型时代的工具生态之争与协同未来 ——从架构差异到应用场景的深度解析 引言 在大模型驱动的AI应用生态中,LangChain与Model Context Protocol (MCP) 代表了两种截然不同的技术路径:前者以灵活的工具链和开发者友好性著称…...
【LLaMA-Factory实战】Web UI快速上手:可视化大模型微调全流程
一、引言 在大模型微调场景中,高效的工具链能显著降低开发门槛。LLaMA-Factory的Web UI(LlamaBoard)提供了低代码可视化平台,支持从模型加载、数据管理到训练配置的全流程操作。本文将结合结构图、代码示例和实战命令,…...
源码编译Qt StateMachine
编译某个项目时报错提示fatal error: QSignalTransition: No such file or directory,是因为qtbase中没有包含StateMachine模块,需要qt/qtscxml.git - SCXML (state machine notation) compiler and related tools 编译安装qtscxml 执行如下步骤&#…...
C++ STL vector高级特性与实战技巧
引言 各位小伙伴们好!上一篇博客我们介绍了vector的基础知识和常见操作,今天我们将更深入地探讨vector的高级特性、内存管理细节以及实战应用技巧。 想象一下vector就像一辆能自动变长的公交车,我们上一篇讲了如何上下车(添加删…...
[Windows] Kazumi番剧采集v1.6.9:支持自定义规则+在线观看+弹幕,跨平台下载
[Windows] Kazumi番剧采集 链接:https://pan.xunlei.com/s/VOPLMhEQD7qixvAnoy73NUK9A1?pwdtu6i# Kazumi是一款基于框架; 开发的轻量级番剧采集工具,专为ACG爱好者设计。通过;自定义XPath规则; 实现精准内容抓取,支持多平台(An…...
二种MVCC对比分析
文章目录 前言MVCCInnodb的MVCC版本链回滚与提交可见性判断 Oracle的MVCC版本链 PostgreSQL的MVCCMVCC实现可见性判断特点 前言 MVCC(多版本并发控制,Multi-Version Concurrency Control)是一种数据库管理系统(DBMS&#x…...
Python蓝桥杯真题代码
以下是一些不同届蓝桥杯Python真题代码示例: 第十四届青少年蓝桥杯python组省赛真题 删除字符串后缀 input_str input("请输入一个字符串:") suffixes (er, ly, ing) for suffix in suffixes: if input_str.endswith(suffix): input_str …...
高中数学联赛模拟试题精选学数学系列第5套几何题
四边形 A B C D ABCD ABCD 的对角线 A C AC AC 与 B D BD BD 互相垂直, 点 M M M, N N N 在直线 B D BD BD 上, 且关于直线 A C AC AC 对称. 设点 M M M 关于直线 A B AB AB, B C BC BC 的对称点分别为 X X X, Y Y Y, 点 N N N 关于直线 C D CD CD, D A DA DA 的…...
【KWDB 创作者计划】Docker单机环境下KWDB集群快速搭建指南
【KWDB 创作者计划】Docker 单机环境下 KaiwuDB集群快速搭建指南 前言一、KWDB介绍1.1 KWDB简介1.2 主要特点1.3 典型应用场景 二、环境介绍2.1 部署环境要求2.2 本地环境规划2.3 本次部署介绍 三、下载容器镜像四、创建相关证书文件4.1 创建部署目录4.2 创建证书文件4.3 查看证…...
基于51单片机和LCD1602、矩阵按键的小游戏《猜数字》
目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、LCD16022、矩阵按键3、定时器0 四、主函数总结 系列文章目录 前言 用的是普中A2开发板,用到板上的矩阵按键,还需要外接一个LCD1602液晶显示屏。 【单片机】STC89C52RC 【频率】12T11.05…...
从广义线性回归推导出Softmax:理解多分类问题的核心
文章目录 引言:从回归到分类广义线性模型回顾从二分类到多分类Softmax函数的推导建模多类概率基于最大熵原理具体推导步骤Softmax函数的数学形式 Softmax回归模型参数的可辨识性 最大似然估计与交叉熵损失似然函数交叉熵损失梯度计算 Softmax回归的实现要点数值稳定…...
传奇各版本迭代时间及内容变化,屠龙/嗜魂法杖/逍遥扇第一次出现的时间和版本
【早期经典版本】 1.10 三英雄传说:2001 年 9 月 28 日热血传奇正式开启公测,这是传奇的第一个版本。游戏中白天与黑夜和现实同步,升级慢,怪物爆率低,玩家需要靠捡垃圾卖金币维持游戏开销,遇到高级别法师…...
云计算-私有云-私有云运维开发
三、私有云运维开发(15) 使用自动化运维工具 Ansible 完成系统的自动化部署与管理。 基于 OpenStack APIs 与SDK,开发私有云运维程序 1.OpenStack Python运维开发:实现镜像管理(7分) 编写Python代…...
hadoop存储数据文件原理
Hadoop是一个开源的分布式计算框架,可以用于存储和处理大规模数据集。Hadoop的存储系统基于Hadoop Distributed File System(HDFS),它的主要原理如下: 数据切块:当用户向HDFS中存储一个文件时,该…...
spring2.x详解介绍
一、核心架构升级 Spring 2.x 是 Spring 框架的重要迭代版本(2006-2009年间发布),其核心改进体现在 模块化设计 和 轻量化配置 上。相较于 1.x 版本,2.x 通过以下方式重构了架构: XML Schema 支持:弃用 D…...
探索Grok-3的高级用法:功能与应用详解
引言 随着人工智能技术的迅猛发展,xAI推出的Grok-3模型以其卓越的性能和创新功能,成为AI领域的新标杆。Grok-3不仅在计算能力上实现了十倍提升,还引入了多种高级模式和实时数据处理能力,适用于学术研究、技术分析、市场洞察等多场…...
PyTorch_张量转换为numpy数组
使用 tensor.numpy 函数可以将张量转换为 ndarray 数组,但是共享内存,可以使用 copy 函数避免共享。共享内存会导致张量或者numpy中的其中一个更改后,另外一个会受到影响。 代码 import torch # 张量转换为 numpy 数组 def test01():data_te…...
什么是“原子变量”?
原子变量(std::atomic)在C++中是一个非常关键的机制,特别是在多线程编程中保持数据安全和避免竞争条件。它的设计目标就是让一段操作在多线程环境下变得“原子性”,即不可被中断,保证操作的完整与一致。 一、什么是“原子变量”? 简单来说: 普通变量:在多线程环境中,…...
[Linux开发工具]gcc/g++
C语言文件编译运行 gcc code.c -o mycode gcc -o mycode code.c 预处理 汇编 编译 链接 预处理(进行宏替换/去注释/条件编译/头文件展开) gcc -E code.c -o code.i -E ->从现在开始进行程序的编译,当我们 的程序预处理完毕后,翻译工作,就停下来 code.i预处理之后的结果 …...
【Mytais系列】Type模块:类型转换
MyBatis 的 类型系统(Type System) 是框架处理 Java 类型与数据库类型之间映射的核心模块,它通过 类型处理器(TypeHandler)、类型别名(TypeAlias) 和 类型转换器 等机制,实现了数据库…...
C++类_虚基类
在 C 里,虚基类是用来解决菱形继承问题的。菱形继承问题是指当一个派生类从两个或更多基类派生,而这些基类又从同一个基类派生时,派生类会包含多份间接基类的数据副本,这可能会引发数据冗余和二义性问题。虚基类可以保证在派生类中…...
【自然语言处理与大模型】使用Xtuner进行模型合并与导出
在上一篇文章中我为大家介绍了Xtuner框架如何进行QLoRA微调,这个框架在微调过后会得到适配器权重文件,它的后缀是.pth。但原模型都是huggingface模型,其后缀是safetensors。所以呢我们在使用这个框架导出模型之前要合并,合并之前要…...
数据结构4.0
大家好,今天是栈的知识点~ 目录 一、栈的概念 1.0 栈的概念 2.0 概念区分 二、栈的方法 1.0 MyStack方法: 2.0 将元素压入栈顶 3.0 移除并返回栈顶元素 4.0 返回栈顶元素但不移除 三、栈的题目 1.0括号匹配 2.0逆波兰表达式求值 3.0 出栈…...
SMT贴片检验标准核心要点与实施规范
内容概要 SMT贴片检验标准是确保电子产品组装质量的核心框架,其核心要点覆盖从原材料到成品的全流程工艺控制。该标准体系以焊点质量、元件定位精度及锡膏印刷检测为技术基线,结合IPC-A-610电子组装验收规范,对PCBA加工中的缺陷类型、判定阈…...
探索 C++23 std::to_underlying:枚举底层值获取的利器
文章目录 引言基本概念作用使用示例与之前方法的对比在 C23 中的意义总结 引言 在 C 的发展历程中,每一个新版本都带来了许多令人期待的新特性和改进,以提升代码的安全性、可读性和可维护性。C23 作为其中的一个重要版本,也不例外。其中&…...
PyTorch学习之张量(Tensor)(一)
1. 张量的基本概念 1.1. 定义与特性 张量是PyTorch中最基础的数据结构,可视为多维数组的泛化形式,支持标量(0维)、向量(1维)、矩阵(2维)及更高维度的数据存储。其核心特性包括&…...
理解数学概念——支集(支持)(support)
1. 支集(support)的定义 在数学中,一个实函数 f 的支集(support)是函数的不被映射到 0 的元素域(即定义域)的子集。若 f 的(定义)域(domain)是一个拓扑空间(即符合拓扑的集合),则 f 的支集则定义为包含( f 的元素域中)不被映射到0的所有点之最小闭集…...
Python 部分内置函数及其用法详解
在 Python 编程的世界里,内置函数是我们强大的 “工具箱”,它们提供了丰富而便捷的功能,帮助我们高效地完成各种任务。本文将带你深入了解这些常用内置函数及其用法,通过简单易懂的实例,让你轻松掌握它们。 一、数据类…...
[蓝桥杯真题题目及解析]2025年C++b组
移动距离(填空)** 小明初始在二维平面的原点,他想前往坐标 (233,666)。在移动过程中,他只能采用以下两种移动方式,并且这两种移动方式可以交替、不限次数地使用: 水平向右移动,即沿着 x 轴正方…...
yolov5 train笔记4 roboflow
How to Train a YOLOv5 Model On a Custom Dataset Sign in to Roboflow https://www.youtube.com/watch?vr3Ke7ZEh2Qo 他的ai懂中文的 还是得训练,明天再搞 https://www.youtube.com/watch?vEmYCpbFQ5wo&t2s 很香但是我没有马内...
工作记录 2015-06-01
工作记录 2015-06-01 序号 工作 相关人员 1 修改了FnetFax 修改了iConverter 修改了iCDA 郝 FNSR识别引擎 统计了最近几个星期0223医院的打字和录音的时间比。上周的比值是3.42,是近8个星期中最低的值。和05/03/2015 - 05/09/2015的3.74相比,下降…...
创意Python爱心代码分享
在代码的世界里,程序员以独特方式书写浪漫。他们精心打造的一个个 demo,宛如熠熠星辰。这些 demo 不仅是技术结晶,更饱含对编程的热爱与执着。从简洁的算法示例到复杂的系统雏形,每一行代码都凝聚着思考与智慧。它们被无私分享&am…...
【RAG】向量?知识库的底层原理:向量数据库の技术鉴赏 | HNSW(导航小世界)、LSH、K-means
一、向量化表示的核心概念 1.1 特征空间与向量表示 多维特征表示:通过多个特征维度(如体型、毛发长度、鼻子长短等)描述对象,每个对象对应高维空间中的一个坐标点,来表示狗这个对象,这样可以区分出不同种…...
降维大合集
1. 主成分分析(PCA,Principal Component Analysis) 基本原理 PCA 是一种线性降维方法,其核心思想是: 找到数据中方差最大的方向(称为主成分),并将数据投影到这些方向上。 利用正交变…...
AWS上构建基于自然语言和LINDO API的线性规划与非线性规划的优化计算系统
我想要实现一个通过使用C#、Semantic Kernel库、OpenAI GPT 4的API和附件文档里提到的LINDO API 15.0实现通过中文自然语言提示词中包含LATEX代码输入到系统,通过LINDO API 15.0线性规划与非线性规划的优化计算程序输出计算结果和必要步骤的应用,结果用中…...
26考研 | 王道 | 计算机网络 | 第三章 数据链路层
26考研 | 王道 | 第三章 数据链路层 数据链路层所处的地位 数据链路层 使用 物理层 提供的“比特传输”服务数据链路层 为 网络层 提供服务,将网络层的 IP数据报(分组)封装成帧,传输给下一个相邻结点物理链路:传输介质…...
学习黑客资产威胁分析贴
第一天作业: 完成作业奖励: 🎁 奖励 1 ── Week 2《Web 渗透手册》预览 Day主题关键目标练手靶场 / 工具1HTTP 基础 & Burp 入门抓包、改包、重放PortSwigger Academy:“HTTP basics”2SQL 注入原理手工注入 sqlmapDVWA →…...
CSS元素动画篇:基于当前位置的变换动画(合集篇)
CSS元素动画篇:基于当前位置的变换动画(合集篇) 前言位移效果类元素动画水平抖动效果效果预览代码实现 垂直抖动效果效果预览代码实现 摇头动画效果效果预览代码实现 点头动画效果效果预览代码实现 旋转效果类元素动画摇摆动画效果效果预览代…...
Spring 容器相关的核心注解
以下是 Spring 容器中用于 Bean 管理、依赖注入、配置控制 的关键注解,按功能分类说明: 1. Bean 声明与注册 注解作用示例Component通用注解,标记一个类为 Spring Bean(自动扫描注册) Compo…...
经典算法 最小生成树(prim算法)
最小生成树 题目描述 给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环,边权可能为负数。 求最小生成树的树边权重之和。如果最小生成树不存在,则输出 impossible。 给定一张边带权的无向图 G (V, E),其中:…...
机器学习中的分类和回归问题
1. 分类问题 机器学习中的分类问题是一种监督学习任务,其核心目标是将数据样本分配到预定义的离散类别中,例如判断邮件是否为垃圾邮件、识别图像中的物体类型等。 分类通过已知标签的训练数据(如带类别标注的样本)学习特征与类别…...
pip命令
安装&卸载 -- 安装numpy pip install numpy1.26.4 -- 从索引安装(自定义源) pip install package_name --index-url https://custom_url -- 安装本地文件或目录 pip install /path/to/package.whl pip install D:\Downloads\transformers-4.40.0-py…...
n8n工作流自动化平台的实操:Cannot find module ‘iconv-lite‘
解决问题: 1.在可视化界面,执行const iconv require(iconv-lite);,报Cannot find module iconv-lite [line 2]错误; 查看module的路径 进入docker容器 #docker exec -it n8n /bin/sh 构建一个test.js,并写入如何代码 vi tes…...
AIGC时代——语义化AI驱动器:提示词的未来图景与技术深潜
文章目录 一、技术范式重构:从指令集到语义认知网络1.1 多模态语义解析器的进化路径1.2 提示词工程的认知分层 二、交互革命:从提示词到意图理解2.1 自然语言交互的认知进化2.2 专业领域的认知增强 三、未来技术图谱:2025-2030演进路线3.1 20…...
基于Springboot高校网上缴费综合务系统【附源码】
基于Springboot高校网上缴费综合务系统 效果如下: 系统登陆页面 个人中心页面 论坛交流页面 发表评论页面 付款页面 教师缴费页面 新增缴费类型页面 审核页面 研究背景 随着高校信息化建设进程的加速,传统手工缴费模式因效率低、错误率高、管理成本高…...
返回倒数第k个节点题解
这题要用到快慢指针的思想。 1.定义两个指针,一个快指针,一个慢指针,初始都指向头结点 2.先让快指针往后走k步,也就是移动k个节点,这个时候快指针比慢指针领先k 3.现在让快慢指针同时往后移动,两指针之间…...