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

Java八股文——MySQL篇

文章目录

  • Java八股文——MySQL篇
    • 慢查询
      • 如何定位慢查询?
      • 如何分析慢SQL
        • Explain
        • 标准答案
    • 索引
      • 索引类型
      • 索引底层数据结构
      • 什么是聚簇索引什么是非聚簇索引?(二级索引)(回表)
        • 聚集索引选取规则
        • 回表查询
      • 什么是覆盖索引
      • MySQL超大分页处理
        • 覆盖索引+子查询
        • 使用索引字段+条件过滤
        • 存储游标或位置值
      • 索引创建原则有哪些
      • 什么情况下索引会失效
        • 1. 违反最左前缀法则
        • 2. 范围查询右边的列,不能使用索引
        • 3. 不能在索引列上进行运算操作,索引将失效
        • 4. 字符串不加单引号,造成索引失效。
        • 5. LIKE 开头是通配符
      • SQL优化的经验
        • 表的设计优化
        • SQL语句优化
        • 索引优化
        • 主从复制、读写分离
    • 事务
      • 事务特性
        • ACID
      • 并发事务带来哪些问题
        • 1. 脏读(Dirty Read)
        • 2. 不可重复读(Non-repeatable Read)
        • 3. 幻读(Phantom Read)
      • 四种隔离级别
      • undo log和redo log的区别(事务的实现方式)
        • undo log
        • redo log
      • 事务的隔离性如何保证(MVCC)
        • MVCC-实现原理
    • 主从同步
      • 原理
      • 主从同步和双机热备区别
        • 主从同步(主库 → 从库)
        • 双机热备(HA,高可用)
    • 分库分表
      • 拆分策略
        • 垂直拆分
        • 水平拆分
      • 新的问题和新的技术
        • 分库分表中间件:

Java八股文——MySQL篇

慢查询

如何定位慢查询?

方案一:开源工具

  • 调试工具:Arthas
  • 运维工具:Prometheus、Skywalking

方案二:MySQL自带慢日志

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。

如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

#开启MySQL慢日志查询
slow_query_log=1
# 设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=2

如何分析慢SQL

  • 聚合查询(可以添加临时表解决)
  • 多表查询(可以试着优化SQL语句结构)
  • 表数据量过大查询
  • 深度分页查询
Explain
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件;
  • possibel_key :当前sql可能会使用到的索引

  • key :当前sql实际命中的索引

  • key_len :索引占用的大小

  • Extra :额外的优化建议

    • Using where; Using Index:查找使用了索引,需要的数据都在索引列中能找到,不需要回表查询数据
    • Using index condition:查找使用了索引,但是需要回表查询数据(有优化空间)
  • type:这条sql的连接的类型,性能由好到差为NULL、system、const、eq_ref、range、index、all

    NULL:查询没有用到表

    system:查询系统中的表

    const:根据主键查询

    eq_ref:主键索引查询或唯一索引查询

    ref:索引查询

    range:范围查询

    index:索引树扫描

    all:全盘扫描

标准答案

如果一条sql执行很慢的话,我们通常会使用sql自动的执行计划explain去查看这条sql的执行情况,比如在这里面可以通过key和key_len检查是否命中了索引,如果本身已经添加了索引,也可以判断索引是否有失效的情况,第二个,可以通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描,第三个可以通过extra建议来判断,是否出现了回表的情况,如果出现了可以尝试添加索引或修改返回字段来修复。

索引

索引(index)是帮助MySQL高校获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+)树,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

索引类型

索引类型是否唯一是否允许为 NULL是否支持多列典型用途特点总结
主键索引唯一标识一条记录表只能有一个主键,自动创建索引
唯一索引✅(仅一条 NULL)限制字段值不能重复可有多个,允许一个 NULL 值
普通索引加速查询(如 WHERE、ORDER BY)最常见,不强制唯一
联合索引可选多字段组合查询遵循最左前缀原则
全文索引✅(InnoDB 5.6+)文本内容检索(英文效果好)仅支持 MATCH ... AGAINST 查询
空间索引❌(必须非空)地理空间数据(GIS)仅支持 GEOMETRY 类型字段
前缀索引长字符串字段索引优化需指定前缀长度,节省索引空间

索引底层数据结构

MySQL默认使用的索引底层数据结构是B+树。

  • 阶数更多,路径更短
  • 磁盘读写代价B+树更低,非叶子节点只存储指针,叶子节点存储数据
  • B+树便于扫库和区间查询,叶子节点是一个双向链表
特性B树B+树
数据存储位置内部节点和叶子节点仅叶子节点
叶子节点连接
查询路径不一定到叶子节点必定到叶子节点
范围查询效率较低
节点扇出较小较大
应用场景内存数据结构外部存储(数据库、文件系统)

什么是聚簇索引什么是非聚簇索引?(二级索引)(回表)

分类含义特点
聚簇索引(Clustered Index)将数据存储与索引放到了一块,索引结构的叶子节点保存了整行数据必须有,而且只有一个
二级索引(Secondary Index)将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键可以存在多个
聚集索引选取规则
  • 如果存在主键,主键索引就是聚集索引
  • 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引
  • 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。
回表查询
  • 在使用非聚簇索引查询时,先通过索引定位到主键值,再通过主键去聚簇索引中查找真实数据行的过程。

什么是覆盖索引

覆盖索引是指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到。

举例

#id为主键,默认是主键索引
#name字段为普通索引
select * from user where id = 1;   #是覆盖索引,因为主键索引是聚簇索引,包括了一整行数据。不需要回表查询。
select id, name from user where name = 'Arm';    #是覆盖索引,因为条件使用了索引,并且要查询的字段id和name都使用了索引,不需要回表查询。
select id, name, gender from user where name = 'Arm';	#不是覆盖索引,因为返回的列中gender没有索引,所以需要回表查询。

MySQL超大分页处理

在数据量比较大时,如果进行limit分页查询,在查询时,越往后,分页查询效率较低。

覆盖索引+子查询
  • 只查主键再回表,减少排序数据量

    SELECT * FROM table 
    WHERE id IN (SELECT id FROM table ORDER BY id LIMIT 100000, 10
    );select * from
    sku t, (select id from sku order by id limit 100000,10) a 
    where t.id = a.id;SELECT t.* FROM (SELECT id FROM table ORDER BY id LIMIT 100000, 10
    ) AS a
    JOIN table t ON t.id = a.id;
    
使用索引字段+条件过滤
  • 通过记录上次的最大id来“跳页”

    -- 第一次查询
    SELECT * FROM table WHERE id > 0 ORDER BY id LIMIT 10;-- 下一页(记录上一页最大 id 为 120)
    SELECT * FROM table WHERE id > 120 ORDER BY id LIMIT 10;
    
存储游标或位置值
  • 如果是固定翻页结构(如前端分页),可以在后端缓存当前页最大ID或游标,前端传回续查。

索引创建原则有哪些

  1. 针对与数据量较大,且查询比较频繁的表建立索引。 (单表超过10万数据)
  2. 针对常作为查询条件、排序、分组操作的字段建立索引。
  3. 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高
  4. 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
  5. 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。
  6. 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。
  7. 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。

什么情况下索引会失效

1. 违反最左前缀法则

如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始,并且不跳过索引中的列。匹配最左前缀法则,走索引。

正例

-- seller表有联合索引:name 1、status 2、address 3
select * from seller where name = '小米';  #✅
select * from seller where name = '小米' and status = '1';  #✅
select * from seller where name = '小米' and status = '1' and address = '北京市';  #✅

反例

-- seller表有联合索引:name 1、status 2、address 3
select * from seller where status = '1' and address = '北京市';  #❌
select * from seller where status = '1';  #❌
select * from seller where name = '小米' and address = '北京市';  #❌
2. 范围查询右边的列,不能使用索引

当遇到第一个范围查询时,联合索引后面的字段不再参与索引过滤,只能回表做判断。

SELECT * FROM seller WHERE name = '小米' AND status = '1' AND addres = '北京市'; #可以完全索引✅
SELECT * FROM seller WHERE name = '小米' AND status > '1' AND addres = '北京市'; #在遇到第一个大于条件后,后面的字段(address)无法再参与索引❌
3. 不能在索引列上进行运算操作,索引将失效
select * from seller where substring(name, 3, 2) = '科技'; #❌
4. 字符串不加单引号,造成索引失效。

索引字段是字符串,传入数字会触发隐式转换,索引失效。索引字段上发生任何的类型转换都会导致索引失效。

select * from seller where status = '0'; #✅
select * from seller where status = 0; #❌
5. LIKE 开头是通配符
WHERE name LIKE '%Tom%'  -- 前面有通配符,索引失效 ❌
WHERE name LIKE 'Tom%'   -- 后面通配符,索引生效 ✅

SQL优化的经验

表的设计优化
  • 设计表的时候参考了阿里开发手册《嵩山版》
  • 比如设置合适的数值,要根据实际情况选择
  • 比如设置合适的字符串类型,char定长效率高,varchar可变长度,效率稍低。长度尽量设置在2^n - 1;
SQL语句优化
  • SELECT语句务必指明字段名称(避免直接使用select *)

  • SQL语句要避免造成索引失效的写法

  • 尽量使用union all代理union,union会多一次过滤,效率低

    select * fromn user where id > 2 union all select * from user where id < 5; #Union all会直接将两个查出来的进行拼接,不会过滤其中重复的
    select * from user where id > 2 union select * from user where id < 5; # Union会在拼接之后,帮你过滤掉其中重复的字段
    
  • 避免在where子句中对字段进行表达式操作

  • Join优化 能用inner join就不用left join + right join,如必须使用,一定要以小表为驱动。

    内连接会对两个表进行优化,优先把小表放到外边,把大表放到里边。left join或right join,不会调整顺序。

    SELECT * FROM 小表 LEFT JOIN 大表 ON 条件;
    SELECT * FROM 大表 RIGHT JOIN 小表 ON 条件;
    
    JOIN 类型保留哪一侧全部数据匹配不到的行是否显示没匹配的列填什么
    INNER JOIN两表都要匹配成功不显示
    LEFT JOIN左表全部NULL
    RIGHT JOIN右表全部NULL
索引优化
主从复制、读写分离

如果数据库的使用场景读的操作比较多的时候,为了避免写的操作所造成的性能影响,可以采用读写分离的架构。

读写分离解决的是,数据库的写入,影响了查询的效率。

事务

事务特性

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

ACID
  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

并发事务带来哪些问题

1. 脏读(Dirty Read)

读取到了其他事务未提交的数据

示例:

  • 事务A:修改账户余额为500,但未提交
  • 事务B:读取到余额是500(其实还没真正生效)。
  • 后来事务A回滚了,数据其实还是原来的1000,
    B读到的是“脏”的数据
2. 不可重复读(Non-repeatable Read)

同一事务内,两次读取同一数据,值不一致

示例:

  • 事务A:第一次查询账户余额是1000
  • 事务B:修改余额为500并提交
  • 事务A:再次查询余额变成500
    A两次读取结果不一致,称为不可重复读
3. 幻读(Phantom Read)

同一事务内,两次查询数据集合,结果集的“行数”不同(有新行出现或消失)。

示例:

  • 事务A:查询“所有工资 > 5000 的员工”返回10条
  • 事务B:插入一条工资为6000的新员工并提交
  • 事务A:再次查询,变成11条
    多了一条“幻影”数据,称为幻读

四种隔离级别

隔离级别是否会脏读不可重复读幻读并发性能MySQL 默认
读未提交(Read Uncommitted)✅ 会✅ 会✅ 会
读已提交(Read Committed)❌ 不会✅ 会✅ 会较高❌(Oracle 默认)
可重复读(Repeatable Read)❌ 不会❌ 不会✅ 会✅(MySQL 默认)
串行化(Serializable)❌ 不会❌ 不会❌ 不会低(加锁最多)
  1. 读未提交
  • 事务可以读到其他事务未提交的数据
  • 最弱隔离,可能出现脏读、不重复读、幻读。
  1. 读已提交
  • 只能读到已提交的数据,避免脏读。
  • 但事务期间数据可能被别的事务修改,出现不可重复读和幻读。
  • Oracle 默认隔离级别。
  1. 可重复读(MySQL 默认)
  • 同一事务多次读取,结果始终一致(通过MVCC实现)。
  • 解决了不可重复读。
  • 幻读仍可能出现(但InnoDB通过间隙锁在某些场景下可防止幻读)。
  1. 串行化
  • 所有操作都串行执行,强制加锁。
  • 最安全,但并发性能最低。

undo log和redo log的区别(事务的实现方式)

  • 缓冲池(buffer pool):主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度。
  • 数据页(page):是InnoDB存储引擎磁盘管理的最小单元,每个页的大小默认为16KB。页中存储的是行数据。
undo log

回滚日志,用于记录数据被修改前的信息,作用包含两个:提供回滚MVCC(多版本并发控制)。undo log和redo log记录物理日志不一样,它是逻辑日志

  • 可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然

  • 当update一条记录时,它记录一条对应相反的update记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。

  • 作用:记录数据被修改前的旧值,用于:

    事务回滚

    MVCC(多版本并发控制,支持快照读)

  • 触发场景:INSERTUPDATEDELETE 时生成 undo log。

redo log

重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性

该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用。

  • 作用:记录数据修改后的新值,用于:

    事务提交后保证数据持久化(即使崩溃也能恢复)。

  • 触发场景:

    事务提交前,先把 redo log 写到磁盘(WAL:Write-Ahead Logging)。

项目undo logredo log
作用回滚、MVCC快照读崩溃恢复、保证持久化
记录内容修改前的数据修改后的数据
使用时机事务回滚、快照读事务提交、宕机恢复
物理位置InnoDB表空间(undo段)InnoDB redo log 文件
典型用途回滚、快照一致性数据库宕机时恢复

事务的隔离性如何保证(MVCC)

排他锁

如果一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁。

MVCC:多版本并发控制(Multi-Version Concurrency Control)。指维护一个数据的多个版本,使得读写操作没有冲突。

MVCC-实现原理
  • 记录中的隐藏字段

    隐藏字段含义
    DB_TRX_ID最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID。
    DB_ROLL_PTR回滚指针,指向这条记录的上一个版本,用于配合undo log,指向上一个版本。
    DB_ROW_ID隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段。
  • undo log

回滚日志,在insert、update、delete的时候产生的便于数据回滚的日志。

当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。

而update、delete的时候,产生的undo log日志不仅在回滚时需要,mvcc版本访问也需要,不会立即被删除。

undo log版本链

不同事务或相同事务对同一条记录进行修改,会导致该记录的undo log生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。

  • readview

ReadVie(读视图)是快照SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。

  • 当前读

    读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如select ... log in share mode(共享锁)select ... for update、update、insert、delete(排他锁)都是一种当前读。

  • 快照读

    简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。

    • 读已提交(Read Committed):每次select,都生成一个ReadView
    • 可重复读(Repeatable Read):仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。

ReadView中包含了四个核心字段

字段含义
m_ids当前活跃的事务ID集合
min_trx_id最小活跃事务ID
max_trx_id预分配事务ID,当前最大事务ID+1(因为事务ID是自增的)
creator_trx_idReadView创建者的事务ID

版本链数据访问规则:

trx_id:代表是当前事务ID

  1. trx_id == creator_trx_id?可以访问该版本✅ → 成立,说明数据是当前这个事务更改的。
  2. trx_id < min_trx_id?可以访问该版本✅ → 成立,说明数据已经提交了。
  3. trx_id > max_trx_id?不可以访问该版本❌ → 成立,说明该事务是在ReadView生成后才开启。
  4. min_trx_id <= trx_id <= max_trx_id?如果trx_id不在m_ids中是可以访问该版本的✅ → 成立,说明数据已经提交。

总结:只看在当前 ReadView 生成前已经提交的版本,未提交的版本看不到。

主从同步

原理

MySQL主从复制的核心就是二进制日志:

​ 二进制日志(BINLOG)记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。

  1. Master主库在事务提交时,会把数据变更记录在二进制日志文件Binlog中。
  2. 从库读取主库的二进制日志文件Binlog,写入到从库的中继日志Relay Log。
  3. slave重做中继日志中的事件,将改变反映它自己的数据。

主从同步和双机热备区别

对比点主从同步双机热备
目的提升读性能 / 备份高可用、故障自动切换
数据同步方向单向(主 → 从)通常双向或实时同步
故障切换需手动或自动提升从为主快速切换,秒级高可用
负载分担主写、从读(读写分离)一般主负责,备不参与业务
常见场景读多写少系统强要求高可用、不能停机系统
主从同步(主库 → 从库)

特点

  • 主库处理 写请求,从库主要处理 读请求
  • 数据同步是 单向的(主 → 从)。
  • 一般用于 读写分离提升读性能备份
  • 可能存在 同步延迟
双机热备(HA,高可用)

特点

  • 两台机器(主 + 备)运行同一套服务,互为备份
  • 备机通常处于 热备状态,实时或准实时同步数据。
  • 主机故障后,快速切换到备机,保证业务连续。
  • 目标是 高可用(HA),不是分担读写负载。

分库分表

分库分表的时机:

  1. 前提,项目业务数据逐渐增多,或业务发展比较迅速。单表的数据量达到1000W或20G以后

  2. 优化已解决不了性能问题(主从读写分离、查询索引)

  3. IO瓶颈(磁盘IO、网络IO)、CPU瓶颈(聚合查询、连接数太多)

拆分策略

垂直拆分
  • 垂直分库:以表为依据,根据业务将不同的表拆分到不同库中。

    特点:

    1. 按业务对数据分级管理、维护、监控、扩展
    2. 在高并发下,提高磁盘IO和数据量连接数
  • 垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中。

    拆分规则:

    • 把不常用的字段单独放在一张表
    • 把text,blob等大字段拆分出来放在附表中

    特点:

    • 冷热数据分离
    • 减少IO过度争抢,两表互不影响
水平拆分
  • 水平分库:将一个库的数据拆分到多个库中。

    路由规则:

    • 根据id节点取模
    • 按用户 ID、地区、业务线、时间分。
    • 按id进行范围路由,节点1(1-100万),节点2(100万-200万)

    特点:

    • 解决了单库大数量,高并发的性能瓶颈问题
    • 提高了系统的稳定性和可用性
  • 水平分表:将一个表的数据拆分到多个表中(可以在同一个库内)。

    路由规则同水平分库

    特点:

    • 优化单一表数据量过大而产生的性能问题。
    • 避免IO争抢并减少锁表的几率。

新的问题和新的技术

  • 分布式事务一致性问题
  • 跨节点关联查询
  • 跨节点分页、排序函数
  • 主键避重
分库分表中间件:
  • sharding-sphere
  • mycat

相关文章:

Java八股文——MySQL篇

文章目录 Java八股文——MySQL篇慢查询如何定位慢查询&#xff1f;如何分析慢SQLExplain标准答案 索引索引类型索引底层数据结构什么是聚簇索引什么是非聚簇索引&#xff1f;&#xff08;二级索引&#xff09;&#xff08;回表&#xff09;聚集索引选取规则回表查询 什么是覆盖…...

Oracle数据库学习笔记 - 创建、备份和恢复

Oracle数据库学习笔记 创建&#xff0c;备份和恢复 Oracle 版本基于11g 尽量不使用图形界面方式&#xff0c;操作适用于linux和windows 创建数据库 创建实例 # 步骤1&#xff1a;设置环境变量 export ORACLE_SIDmyorcl export ORACLE_HOME/u01/app/oracle/product/19.0.0/dbh…...

Go语言--语法基础5--基本数据类型--输入输出(1)

I : input 输入操作 格式化输入 scanf O &#xff1a; output 输出操作 格式化输出 printf 标准输入 》键盘设备 》 Stdin 标准输出 》显示器终端 》 Stdout 异常输出 》显示器终端 》 Stderr 1 、输入语句 Go 语言的标准输出流在打印到屏幕时有些参数跟别的语言…...

永磁同步电机无速度算法--自适应龙贝格观测器

一、原理介绍 传统龙伯格观测器&#xff0c;在设计观测器反馈增益矩阵K时&#xff0c;为简化分析与设计&#xff0c;根据静止两相坐标系下的对称关系&#xff0c;只引入了K、K,两个常系数&#xff0c;且在实际应用时&#xff0c;大多是通过试凑找到一组合适的反馈增益系数缺乏…...

LangChain工具集成实战:构建智能问答系统完整指南

导读&#xff1a;在人工智能快速发展的今天&#xff0c;如何构建一个既能理解自然语言又能调用外部工具的智能问答系统&#xff0c;成为许多开发者面临的核心挑战。本文将为您提供一套完整的解决方案&#xff0c;从LangChain内置工具包的基础架构到复杂系统的工程实践。 文章深…...

【razor】x264 在 的intra-refresh和IDR插帧

你提到的是这样一个情况: 使用 DirectShow 采集,帧率稳定(如回调了20帧)使用 x264 的 total intra refresh 模式(intra-refresh=1) 进行编码但编码过程中「隔几十秒才有一帧intra(关键帧)」这不正常,具体分析如下: 🎯 一、问题核心 x264 的 intra refresh 模式(特…...

分库分表的取舍

文章目录 大数据量下采用**水平分表**的缺点**1. 跨表查询复杂性与性能下降****2. 数据分布不均衡****3. 分布式事务与一致性问题****4. 扩展性受限****5. 查询条件限制与索引管理复杂****6. 数据迁移与维护成本高****7. 业务逻辑复杂度增加****总结** shardingJdbc分片策略**1…...

随机算法一文深度全解

随机算法一文深度全解 一、随机算法基础1.1 定义与核心特性1.2 算法优势与局限 二、随机算法经典案例2.1 随机化快速排序原理推导问题分析与策略代码实现&#xff08;Python、Java、C&#xff09; 2.2 蒙特卡罗方法计算 π 值原理推导问题分析与策略代码实现&#xff08;Python…...

在 Conda 环境下配置 Jupyter Notebook 环境和工作目录

作为数据科学家或Python开发者&#xff0c;Jupyter Notebook 是我们日常工作的得力工具。本文将详细介绍如何在 Conda 环境中配置 Jupyter Notebook&#xff0c;包括环境设置和工作目录管理&#xff0c;帮助你打造高效的工作流程。 为什么要在 Conda 环境中使用 Jupyter Noteb…...

MS39531N 是一款正弦驱动的三相无感直流电机驱动器,具有最小振动和高效率的特点

MS39531N 是一款正弦驱动的三相无感直流电机驱动器&#xff0c;具有最小振动和高效率的特点 简述 MS39531 是一款正弦驱动的 三相无感直流电机驱动器 &#xff0c;具有最小振动和高效率的特点。该驱动器内部集成了基本的闭环速度控制功能&#xff0c;能够根据特定的应用定制电…...

web3-基于贝尔曼福特算法(Bellman-Ford )与 SMT 的 Web3 DeFi 套利策略研究

web3-基于贝尔曼福特算法&#xff08;Bellman-Ford &#xff09;与 SMT 的 Web3 DeFi 套利策略研究 如何找到Defi中的交易机会 把defi看做是一个完全开放的金融产品图表&#xff0c;可以看到所有的一切东西&#xff1b;我们要沿着这些金融图表找到一些最优的路径&#xff0c;就…...

分析 java 的 Map<String,Map<String, List<Map<String,Integer>>>>

import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;public class Test02 {public static void main(String[] args) {//分析方法&#xff1a;由外层向内层逐渐拆解要定义的变量。再由内向外进行变量赋值//外层第一层&#x…...

ChatterBox - 轻巧快速的语音克隆与文本转语音模型,支持情感控制 支持50系显卡 一键整合包下载

ChatterBox 是一个近期备受关注的开源语音克隆与文本转语音&#xff08;TTS&#xff09;模型&#xff0c;由 Resemble AI 推出&#xff0c;具备体积轻巧及超快的推理速度等特色。它也是首个支持情感夸张控制的开放源代码 TTS 模型&#xff0c;这一强大功能能让您的声音脱颖而出…...

前端开发面试题总结-HTML篇

文章目录 HTML面试高频问答一、HTML 的 src 和 href 属性有什么区别?二、什么是 HTML 语义化?三、HTML的 script 标签中 defer 和 async 有什么区别?四、HTML5 相比于 HTML有哪些更新?五、HTML行内元素有哪些? 块级元素有哪些? 空(void)元素有哪些?六、iframe有哪些优点…...

嵌入式学习--江协stm32day4

只能说拖延没有什么好结果&#xff0c;欠下的债总是要还的。 ADC 模拟信号转化为数字信号&#xff0c;例如温度传感器将外部温度的变化&#xff08;模拟信号&#xff09;&#xff0c;转换为内部电压的变化&#xff08;数字信号&#xff09; IN是八路输入&#xff0c;下方是选择…...

【Matlab】连接SQL Server 全过程

文章目录 一、下载与安装1.1 SQL Server1.2 SSMS1.3 OLE DB 驱动程序 二、数据库配置2.1 SSMS2.2 SQL Server里面设置2.3 设置防火墙2.4 设置ODBC数据源 三、matlab 链接测试 一、下载与安装 微软的&#xff0c;所以直接去微软官方下载即可。 1.1 SQL Server 下载最免费的Ex…...

MS8551/MS8552/MS8554 单电源、轨到轨输入输出、高精度运放,可替代AD8551/AD8552/AD8554

MS8551/MS8552/MS8554 单电源、轨到轨输入输出、高精度运放&#xff0c;可替代AD8551/AD8552/AD8554 简述 MS8551/8552/8554 是轨到轨输入输出的高精度运算放大器&#xff0c;它有极低的输入失调电压和偏置电流&#xff0c;单电源电压范围为 1.8V 到 5V 。 MS8551/8552/85…...

什么是 Ansible 主机和组变量

Ansible 是一款强大的自动化工具&#xff0c;可简化配置管理、应用程序部署和预配等 IT 任务。其最有价值的功能之一是能够定义变量&#xff0c;从而为不同的主机和组定制剧本。本文将解释 Ansible 中组变量和主机变量的概念&#xff0c;并通过实际示例说明它们的用法。 Ansib…...

F#语言的区块链

F#语言在区块链中的应用 引言 区块链技术在过去十年中迅速崛起&#xff0c;成为了推动金融、供应链、物联网等多个领域创新的重要力量。近年来&#xff0c;随着区块链技术的普及&#xff0c;各种编程语言也纷纷被应用于区块链的开发中。F#语言作为一种功能性编程语言&#xf…...

9.RV1126-OPENCV 视频的膨胀和腐蚀

一.膨胀 1.视频流的膨胀流程 之前膨胀都是在图片中进行的&#xff0c;现在要在视频中进行也简单&#xff0c;大概思路就是&#xff1a;获取VI数据&#xff0c;然后把VI数据给Mat化发给VENC模块&#xff0c;然后VENC模块获取&#xff0c;这样就完成了。流程图&#xff1a; 2.代…...

查找 Vue 项目中未使用的依赖

在 Vue 项目中查找未使用的依赖可以通过以下几种方法&#xff1a; 1. 使用 depcheck 工具 depcheck 是一个专门用于查找项目中未使用依赖的工具。 安装&#xff1a; bash npm install -g depcheck使用&#xff1a; bash depcheck它会列出&#xff1a; 未使用的依赖缺失…...

华为OD机考-内存冷热标记-多条件排序

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextInt();int[] arr new int[a];for(int…...

UDP 与 TCP 调用接口的差异:面试高频问题解析与实战总结

在日常开发中&#xff0c;我们经常使用封装良好的 TCP 协议栈&#xff0c;比如 HTTP 客户端、Moudou 网络库等&#xff0c;因此很少从“裸 API”角度深入了解 TCP 和 UDP 的套接字调用流程。但在一些系统底层开发或者网络编程面试中&#xff0c;常被问到“TCP 和 UDP 的调用流程…...

AI时代:学习永不嫌晚,语言多元共存

最近看到两个关于AI的两个问题&#xff0c;“现在开始学习AI&#xff0c;是不是为时已晚&#xff1f;”、“AI出现以后&#xff0c;翻译几乎已到末路&#xff0c;那么&#xff0c;随着时代的进步&#xff0c;中文会一统全球吗&#xff1f;” 联想到自己正在做的“万能AI盒”小程…...

『React』Fragment的用法及简写形式

在 React 渲染组件时&#xff0c;每个组件只能返回一个根节点&#xff08;root element&#xff09;。传统上&#xff0c;如果我们需要渲染多条并列的元素&#xff0c;通常会使用一个多余的 <div> 或者其他容器标签将它们包裹起来。但是&#xff0c;这样会在最终的 HTML …...

强化学习入门:交叉熵方法数学推导

前言 最近想开一个关于强化学习专栏&#xff0c;因为DeepSeek-R1很火&#xff0c;但本人对于LLM连门都没入。因此&#xff0c;只是记录一些类似的读书笔记&#xff0c;内容不深&#xff0c;大多数只是一些概念的东西&#xff0c;数学公式也不会太多&#xff0c;还望读者多多指教…...

CSS3 的特性

目录 CSS3 的特性CSS3 的三大特性1. 层叠性2. 继承性3. 优先级 CSS3 新增特性1. 选择器2. 盒模型3. 背景4. 渐变5. 过渡6. 动画7. 2D/3D 变换8. 弹性布局9. 网格布局10. 媒体查询11. 多列布局12. 文字阴影和盒子阴影 CSS3 的特性 CSS3 的三大特性 1. 层叠性 定义&#xff1a…...

Vue前端篇——Vue 3的watch深度解析

&#x1f4cc; 前言 在 Vue.js 的世界中&#xff0c;“数据驱动”是其核心理念之一。而在这一理念下&#xff0c;watch 扮演着一个非常关键的角色。它允许我们监听响应式数据的变化&#xff0c;并在其发生变化时执行特定的业务逻辑。 本文将通过实际代码示例&#xff0c;深入…...

行为型设计模式之Mediator(中介者)

行为型设计模式之Mediator&#xff08;中介者&#xff09; 1&#xff09;意图 用一个中介对象来封装一系列的对象的交互。中介者使各对象不需要显示的相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。 2&#xff09;结构 其中&#xff…...

三维图形、地理空间、激光点云渲染技术术语解析笔记

三维图形、地理空间、激光点云渲染技术术语解析笔记 code review! 文章目录 三维图形、地理空间、激光点云渲染技术术语解析笔记1. Minecraft风格的方块渲染2. Meshing&#xff08;网格化&#xff09;3. Mipmapping&#xff08;多级纹理映射&#xff09;4. Marching Cubes&…...