从新手到高手:彻底掌握MySQL表死锁

欢迎来到我的博客,代码的世界里,每一行都是一个故事


在这里插入图片描述

🎏:你只管努力,剩下的交给时间

🏠 :小破站

从新手到高手:彻底掌握MySQL表死锁

    • 前言
    • 什么是死锁
    • mysql死锁的原因
      • 1. 互斥资源的竞争
      • 2. 事务执行时间过长
      • 3. 不一致的锁定顺序
      • 4. 缺乏索引
      • 5. 行锁升级
      • 6. 锁范围问题
      • 7. 外键约束
      • 8. 不适当的事务隔离级别
    • 如何检测死锁
      • 1. 自动死锁检测
      • 2. 使用InnoDB监控命令
        • 查看InnoDB状态
        • 示例输出
      • 3. 通过错误日志
      • 4. 使用第三方监控工具
      • 5. 手动分析应用程序日志
    • SHOW ENGINE INNODB STATUS详解
      • 1. BACKGROUND THREAD
      • 2. SEMAPHORES
      • 3. LATEST FOREIGN KEY ERROR
      • 4. LATEST DETECTED DEADLOCK
      • 5. TRANSACTIONS
      • 6. FILE I/O
      • 7. INSERT BUFFER AND ADAPTIVE HASH INDEX
      • 8. LOG
      • 其他部分
    • 死锁的预防方法
    • 解决数据库死锁的方法
    • 超过innodb_lock_wait_timeout还一直被锁
      • 1. 手动锁定表
      • 2. 非InnoDB存储引擎
      • 3. 全局锁定
      • 4. 长时间运行的事务
      • 5. 死锁检测功能被禁用
      • 6. 复杂依赖关系导致的锁定
    • 当出现长时间运行的事务导致的所情况
      • 1. 检查和识别长时间运行的事务
      • 2. 终止长时间运行的事务
      • 3. 优化事务设计
      • 4. 合理设置锁等待超时时间
      • 5. 实施监控和报警机制
      • 6. 分析和优化查询
      • 7. 使用合适的隔离级别
      • 示例:终止长时间运行的事务

前言

在我们日常使用MySQL数据库的过程中,死锁问题可能会悄然而至,令人措手不及。就像两辆车在狭窄的巷子里互不相让,谁也过不去。本文将带你一探MySQL死锁的“巷子”,让你成为“交通指挥官”,从容应对数据库中的死锁问题。

什么是死锁

在MySQL中,死锁是指两个或多个事务在并发执行时,因争夺相同的资源而互相等待,从而导致这些事务都无法继续执行的情况。MySQL中的死锁通常发生在使用InnoDB存储引擎的情况下,因为InnoDB支持行级锁,而行级锁的使用会导致更复杂的锁定关系。

死锁示例

考虑以下简单的例子:

​ 1. 事务A开始并锁定了表T中的某一行。

​ 2. 事务B开始并锁定了表T中的另一行。

​ 3. 事务A尝试锁定事务B已经锁定的行,但被阻塞。

​ 4. 事务B尝试锁定事务A已经锁定的行,但也被阻塞。

这时,事务A和事务B都在等待对方释放锁,导致死锁。

mysql死锁的原因

在MySQL中,死锁通常发生在并发访问数据库时。具体来说,MySQL死锁的原因可以归结为以下几种情况:

1. 互斥资源的竞争

MySQL使用行级锁,这意味着在一个事务中,某些行可能会被锁定,使得其他事务无法访问这些行。如果多个事务竞争相同的资源并且请求锁的顺序不同,就可能导致死锁。例如:

  • 事务A锁定行1,尝试锁定行2。
  • 事务B锁定行2,尝试锁定行1。

2. 事务执行时间过长

长时间运行的事务会持有锁更长时间,从而增加死锁的可能性。尤其是在高并发环境中,长时间持有锁的事务更容易与其他事务发生冲突。

3. 不一致的锁定顺序

如果不同事务以不同的顺序请求相同的资源,就可能导致循环等待。例如,事务A先锁定资源R1,再锁定资源R2;而事务B先锁定资源R2,再锁定资源R1,这就可能导致死锁。

4. 缺乏索引

缺乏适当的索引会导致表扫描,增加锁定的行数,从而增加发生死锁的概率。例如,在一个没有索引的表上执行更新操作时,MySQL可能会锁定整个表或大量行。

5. 行锁升级

InnoDB存储引擎在某些情况下会将行锁升级为表锁。如果一个事务持有大量的行锁,并且其他事务尝试锁定同一张表中的其他行,这可能会导致死锁。

6. 锁范围问题

当一个查询涉及范围条件(如BETWEEN、LIKE等)时,MySQL可能会锁定比预期更多的行,从而增加死锁的可能性。例如:

  • UPDATE users SET age = age + 1 WHERE age BETWEEN 20 AND 30;
    这个查询可能会锁定所有age在20到30之间的行,如果其他事务也尝试访问这些行,可能会导致死锁。

7. 外键约束

带有外键约束的表在插入、更新或删除时,如果多个事务涉及相同的父子表,可能会导致死锁。例如,一个事务在父表中插入数据,另一个事务在子表中插入与父表相关的数据,这种情况下可能会发生死锁。

8. 不适当的事务隔离级别

高隔离级别(如Serializable)会增加锁的争用,从而增加死锁的可能性。选择适当的隔离级别可以减少锁冲突。

如何检测死锁

检测死锁是数据库管理中一个重要的任务。对于MySQL,尤其是使用InnoDB存储引擎时,提供了多种检测死锁的方法。以下是一些常用的方法:

1. 自动死锁检测

InnoDB存储引擎具有自动死锁检测机制。如果检测到死锁,它会自动选择一个事务进行回滚,以解除死锁。这个过程是自动进行的,开发者不需要额外干预。但是,了解系统如何检测死锁以及如何响应死锁事件非常重要。

2. 使用InnoDB监控命令

MySQL提供了一些命令可以用来检查死锁信息和调试:

查看InnoDB状态

可以通过以下命令查看InnoDB的状态,其中包含死锁相关的信息:

SHOW ENGINE INNODB STATUS;

该命令输出的结果中包含了最近一次检测到的死锁信息,包括死锁发生时的SQL语句、涉及的事务、锁等待信息等。

示例输出
------------------------
LATEST DETECTED DEADLOCK
------------------------
2023-06-27 12:34:56 0x7f8c3b0e7700
*** (1) TRANSACTION:
TRANSACTION 123456, ACTIVE 5 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 123, OS thread handle 140246293882624, query id 456 localhost root updating
UPDATE t1 SET c1 = c1 + 1 WHERE id = 1
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1 page no 3 n bits 72 index PRIMARY of table `test`.`t1` trx id 123456 lock_mode X locks rec but not gap waiting
*** (2) TRANSACTION:
TRANSACTION 123457, ACTIVE 3 sec updating or deleting
mysql tables in use 1, locked 1
5 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 124, OS thread handle 140246293882625, query id 457 localhost root updating
UPDATE t1 SET c1 = c1 + 1 WHERE id = 2
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 1 page no 3 n bits 72 index PRIMARY of table `test`.`t1` trx id 123457 lock_mode X locks rec but not gap
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1 page no 3 n bits 72 index PRIMARY of table `test`.`t1` trx id 123457 lock_mode X locks rec but not gap waiting

3. 通过错误日志

当InnoDB检测到死锁并回滚一个事务时,会在MySQL错误日志中记录相关信息。你可以检查错误日志来了解死锁事件:

tail -f /var/log/mysql/error.log

4. 使用第三方监控工具

有许多第三方监控工具可以帮助你检测和分析MySQL中的死锁,例如:

  • Percona Toolkit:提供了一些工具,如pt-deadlock-logger,可以持续监控和记录死锁信息。
  • MySQL Enterprise Monitor:MySQL官方的企业级监控工具,可以提供死锁检测和告警功能。

5. 手动分析应用程序日志

在一些情况下,尤其是开发和测试环境中,可以通过手动分析应用程序日志来检测死锁。记录每个事务的开始、结束和异常信息,包括死锁异常,能够帮助你识别死锁模式。

SHOW ENGINE INNODB STATUS详解

SHOW ENGINE INNODB STATUS 是一个命令,用于提供有关 InnoDB 存储引擎的当前状态和活动的信息。以下是该命令输出的主要部分的详细解释:

1. BACKGROUND THREAD

这个部分显示了 InnoDB 后台线程的活动:

  • srv_master_thread loops: 主线程的循环次数,包括活动、空闲和关闭的循环次数。
  • srv_master_thread log flush and writes: 主线程进行日志刷新和写入的次数。

2. SEMAPHORES

这个部分显示了有关 InnoDB 内部信号量的统计信息:

  • OS WAIT ARRAY INFO: reservation count: 操作系统等待的次数。
  • OS WAIT ARRAY INFO: signal count: 操作系统信号的次数。
  • RW-shared spins, RW-excl spins, RW-sx spins: 读写锁自旋的次数。
  • Spin rounds per wait: 每次等待的自旋轮数。

3. LATEST FOREIGN KEY ERROR

这个部分显示了最新的外键错误:

  • 发生外键错误的时间。
  • 导致外键错误的事务及其详细信息。
  • 错误涉及的父表和子表的记录。

4. LATEST DETECTED DEADLOCK

这个部分显示了最新检测到的死锁:

  • 死锁检测到的时间。
  • 参与死锁的事务及其详细信息。
  • 每个事务持有的锁和等待的锁。
  • 被回滚的事务。

5. TRANSACTIONS

这个部分显示了当前活动的事务:

  • Trx id counter: 当前事务 ID 计数器。
  • Purge done for trx's n:o: 已完成的清除事务 ID。
  • 每个会话的事务列表,包括每个事务持有的锁、堆大小等。

6. FILE I/O

这个部分显示了文件 I/O 的详细信息:

  • 每个 I/O 线程的状态。
  • 挂起的普通 aio 读取和写入的数量。
  • 文件系统同步的数量。
  • 每秒读取、写入和 fsync 的次数。

7. INSERT BUFFER AND ADAPTIVE HASH INDEX

这个部分显示了插入缓冲区和自适应哈希索引的详细信息:

  • Ibuf: 插入缓冲区的大小和合并操作的数量。
  • merged operations: 已合并的插入和删除标记操作的数量。
  • discarded operations: 被丢弃的插入和删除标记操作的数量。
  • Hash table size: 哈希表的大小和缓冲区数量。
  • 每秒的哈希搜索和非哈希搜索次数。

8. LOG

这个部分显示了日志的详细信息:

  • Log sequence number: 日志序列号。
  • Log flushed up to: 已刷新日志的序列号。
  • Pages flushed up to: 已刷新页面的序列号。
  • Last checkpoint at: 最后一个检查点的位置。
  • 挂起的日志刷新和检查点写入的数量。
  • 日志 I/O 的总次数和每秒的 I/O 次数。

其他部分

还有一些其他部分提供了有关缓冲池、事务日志、行操作和表锁的信息,这些部分通常用于深入分析数据库的性能问题和调优。

通过以上各个部分的信息,数据库管理员可以了解 InnoDB 存储引擎的当前状态、检测到的问题(如死锁和外键错误),并根据这些信息进行数据库的优化和故障排除。

死锁的预防方法

预防数据库死锁的方法主要包括以下几个方面:

  1. 规范化锁顺序

    • 确保事务在获取多个锁时遵循一致的顺序。这样可以避免多个事务在相反的顺序上获取相同的锁,从而减少死锁的可能性。
  2. 最小化锁持有时间

    • 在事务中尽量减少锁的持有时间,避免长时间的锁定操作。可以将长时间的计算和处理放在事务之外进行,然后再进行短时间的事务操作。
  3. 使用较小的锁粒度

    • 尽量使用较小的锁粒度(例如,行级锁而不是表级锁)。虽然这可能会增加管理的复杂性,但可以减少锁冲突的机会。
  4. 合理设置锁超时

    • 设置合理的锁超时值,确保事务在等待锁的时间超过一定限度后自动放弃,从而避免长时间的死锁状态。
  5. 使用合适的隔离级别

    • 根据业务需求选择合适的事务隔离级别。较高的隔离级别(如串行化)可以减少并发操作的干扰,但也可能增加死锁的机会。较低的隔离级别(如读已提交)可以减少死锁,但可能会带来脏读等问题。
  6. 避免大批量更新

    • 将大批量更新操作分解为较小的批次进行处理,以减少锁冲突的可能性。
  7. 监控和调优

    • 定期监控数据库的死锁情况,分析死锁日志,找出死锁频繁发生的原因,并进行相应的调优。

通过以上方法,可以有效减少数据库中死锁的发生,从而提高系统的并发处理能力和稳定性。

解决数据库死锁的方法

解决数据库死锁的方法主要有以下几种:

  1. 检测并终止死锁

    • 数据库管理系统(DBMS)可以定期检测系统中的死锁情况。当检测到死锁时,可以选择强制终止一个或多个事务,使其回滚,释放资源,从而打破死锁。
  2. 事务回退

    • 如果系统检测到死锁,可以选择回退某些事务,使其重新开始。通常选择回退资源消耗较少的事务,以减少对系统性能的影响。
  3. 手动干预

    • 数据库管理员可以通过手动查看死锁日志和事务信息,手动终止相关的事务来解决死锁问题。手动干预适用于死锁问题较少且能够快速定位死锁原因的情况。
  4. 设置事务超时

    • 为每个事务设置一个超时时间,当事务等待超过该时间后自动终止并回滚。这样可以防止长时间的死锁,但需要权衡超时时间的合理设置。
  5. 调整锁策略

    • 根据死锁发生的情况,调整数据库的锁策略。例如,减少锁的粒度、优化锁的顺序、减少长时间持有锁的操作等。
  6. 使用适当的事务隔离级别

    • 根据业务需求,选择适当的事务隔离级别。虽然高隔离级别可以避免并发问题,但也可能增加死锁的风险。合理选择隔离级别可以在性能和一致性之间取得平衡。
  7. 优化SQL语句和索引

    • 优化查询和更新的SQL语句,确保高效执行。创建适当的索引,减少全表扫描,降低锁争用的概率。
  8. 分区和分片

    • 将大型表进行分区或分片处理,将数据分散到不同的物理文件或服务器上,减少锁冲突的机会。

通过以上方法,可以有效解决数据库中发生的死锁问题,确保系统的稳定性和高效性。

超过innodb_lock_wait_timeout还一直被锁

在MySQL中,正常情况下,InnoDB会在检测到死锁后自动回滚其中一个事务,以解除死锁。然而,有些情况下表可能会一直被锁,即使超过了innodb_lock_wait_timeout参数设置的时间。这种情况的发生通常是由于以下原因:

1. 手动锁定表

使用LOCK TABLES语句手动锁定表时,如果忘记释放锁,则表会一直保持锁定状态。即使超过innodb_lock_wait_timeout时间,这种锁定也不会自动解除。

-- 锁定表
LOCK TABLES table1 WRITE;

-- 忘记解锁表
-- UNLOCK TABLES;

2. 非InnoDB存储引擎

某些存储引擎(如MyISAM)不支持事务和自动死锁检测。对于这些存储引擎,如果表被锁定,则需要手动解除锁定,否则表会一直保持锁定状态。

3. 全局锁定

使用FLUSH TABLES WITH READ LOCKSET GLOBAL read_only = 1命令进行全局锁定时,所有表都会被锁定,直到手动解除锁定。

-- 全局读锁定
FLUSH TABLES WITH READ LOCK;

-- 解除全局读锁定
UNLOCK TABLES;

4. 长时间运行的事务

如果有一个长时间运行的事务持有锁,其他事务在尝试访问相同资源时会一直等待,直到长时间运行的事务完成或达到锁等待超时。即使锁等待超时,持有锁的事务仍会继续运行,并保持锁定状态。

5. 死锁检测功能被禁用

如果InnoDB的死锁检测功能被禁用,系统将无法自动检测和回滚死锁事务,导致锁定一直存在。

-- 启用死锁检测
SET GLOBAL innodb_deadlock_detect = ON;

6. 复杂依赖关系导致的锁定

某些复杂的事务依赖关系可能导致锁定未被及时检测和处理,尤其是在高负载情况下,死锁检测可能会有延迟,导致锁定状态持续。

当出现长时间运行的事务导致的所情况

当出现第四种情况,即由于长时间运行的事务导致其他事务一直等待时,可以采取以下措施来解决问题:

1. 检查和识别长时间运行的事务

首先,检查当前正在运行的事务,识别出长时间运行的事务。

-- 查看正在运行的事务
SHOW PROCESSLIST;

-- 查看锁定信息
SHOW ENGINE INNODB STATUS;

通过上述命令,可以获取当前正在运行的所有事务和锁定信息,包括事务的执行时间、持有的锁等。

2. 终止长时间运行的事务

在确认长时间运行的事务不会影响数据一致性和业务逻辑的前提下,可以手动终止该事务以释放锁。

-- 获取长时间运行的事务的ID(在SHOW PROCESSLIST输出中)
KILL <process_id>;

3. 优化事务设计

为了防止将来再次出现长时间运行的事务,可以对事务设计进行优化:

  • 减少事务的复杂性:尽量避免在一个事务中执行过多的操作,将复杂的事务拆分为多个简单的事务。
  • 缩短事务的执行时间:避免在事务中进行耗时操作,如复杂的计算、长时间的等待等。
  • 按顺序请求锁:确保所有事务按相同的顺序请求锁,以减少发生死锁的可能性。

4. 合理设置锁等待超时时间

根据实际业务需求,合理设置锁等待超时时间(innodb_lock_wait_timeout),避免事务长时间等待。

-- 查看当前锁等待超时时间(默认50秒)
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';

-- 设置锁等待超时时间为合理的值(例如10秒)
SET GLOBAL innodb_lock_wait_timeout = 10;

5. 实施监控和报警机制

实施监控和报警机制,实时监控数据库的运行状况,包括事务的执行时间、锁等待情况等。一旦检测到长时间运行的事务或锁等待超时,可以及时采取措施。

6. 分析和优化查询

对于导致长时间运行的事务,可以分析和优化其包含的查询,确保查询的高效性。

-- 查看慢查询日志
SHOW VARIABLES LIKE 'slow_query_log';

7. 使用合适的隔离级别

根据业务需求选择合适的事务隔离级别,降低锁争用的概率。例如,可以考虑使用读已提交(READ COMMITTED)或可重复读(REPEATABLE READ)隔离级别。

-- 设置会话级别隔离级别为读已提交
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

示例:终止长时间运行的事务

假设你通过SHOW PROCESSLIST命令找到了一个执行时间超过50秒的事务,其Id为1234。你可以通过以下命令终止该事务:

KILL 1234;

通过这些措施,可以有效地管理和优化长时间运行的事务,避免事务长时间等待和表锁定问题,确保数据库的高效运行。

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

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

相关文章

加速鸿蒙生态共建,蚂蚁mPaaS助力鸿蒙原生应用开发创新

6月21日-23日&#xff0c;2024华为开发者大会&#xff08;HDC 2024&#xff09;如期举行。在22日的【鸿蒙生态伙伴SDK】分论坛中&#xff0c;正式发布了【鸿蒙生态伙伴SDK市场】&#xff0c;其中蚂蚁数科旗下移动开发平台mPaaS&#xff08;以下简称&#xff1a;蚂蚁mPaaS&#…

科林Linux7_网络爬虫

一、爬虫 网络资源的下载工具&#xff0c;工作与万维网环境&#xff0c;持续获取网页网站中的网络信息。可持续的数据采集机器人 1、搜索引擎技术使用爬虫 2、数据分析、数据挖掘领域&#xff0c;需要爬虫进行数据准备 3、数据批处理、采集&#xff0c;大量获取某些网站中的…

学习笔记(linux高级编程)7

2._exit 系统调用 void _exit(int status); 功能: 让进程退出,不刷新缓存区 参数: status:进程退出状态 返回值: 缺省 回调函数 3.atexit int atexit(void (*function)(void)); 功能: 注册进程退出前执行的函数 参数: function:函数指针 指向void返回值void参数的函数指针 返…

14、电科院FTU检测标准学习笔记-录波功能2

作者简介&#xff1a; 本人从事电力系统多年&#xff0c;岗位包含研发&#xff0c;测试&#xff0c;工程等&#xff0c;具有丰富的经验 在配电自动化验收测试以及电科院测试中&#xff0c;本人全程参与&#xff0c;积累了不少现场的经验 ———————————————————…

优思学院|工厂的部门架构管理与精益生产

工厂内有不同部门&#xff0c;各部门之间必须协调合作才能发挥整体功能。工厂最主要的部分是制造产品的现场&#xff0c;这里安装了生产工具&#xff0c;还有操作员进行加工或生产制造。 制造时使用的材料或零组件&#xff0c;需要对外采购。对于加工组装型的工厂&#xff0c;…

MMCV【mmclassification】 从0到1 之 Docker 容器环境搭建步骤总结

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 📙 Linux 下 Docker 安装环境检查Docker 安装 [ root 或者 sudo 权限用户可安装 ]给 普通用户 加入 Docker …

【新闻】技术工种魅力大增,美国Z世代职场新出路

美国需要更多水管工&#xff0c;Z世代正在响应这一号召。 长期受到劳动力短缺困扰的技工行业&#xff0c;如今对美国最年轻的就业群体产生新的吸引力&#xff0c;他们中许多人正选择放弃读大学。随着从焊接到机械加工等领域出现技术迭代&#xff0c;薪资正在上涨&#xff0c;这…

第4章 客户端-客户端管理

1. 客户端API 1.1client list client list命令能列出与Redis服务端相连的所有客户端连接信息。 127.0.0.1:6379> client list id254487 addr10.2.xx.234:60240 fd1311 name age8888581 idle8888581 flagsN db0 sub0 psub0 multi-1 qbuf0 qbuf-free0 obl0 oll0 omem0 events…

SpringBoot启动出错:无法访问org.springframework.boot.autoconfigure.SpringBootApplication

无法访问org.springframework.boot.autoconfigure.SpringBootApplication类文件具有错误的版本 61.0&#xff0c;应为 52.0请删除该文件或确保该文件位于正确的类路径子目录中。 出现该问题是由于版本不兼容&#xff0c; 在pom.xml文件中&#xff0c;修改版本为2开头即可

抖音营销新策略:MessageBox与HubSpot集成,引领企业获客新潮流

在全球数字化浪潮中&#xff0c;抖音以其独特的短视频形式、庞大的用户群体和高度互动性&#xff0c;成为了企业出海战略中不可或缺的一环。抖音营销不仅仅是简单的内容发布和互动&#xff0c;它更是一种深度策略和创新思维的体现。今天将深入探讨抖音营销的核心价值、应用场景…

【人工智能学习之图像操作(一)】

【人工智能学习之图像操作&#xff08;一&#xff09;】 图像读写创建图片并保存视频读取色彩空间与转换色彩空间的转换通道分离理解HSV基本图形绘制 阀值操作OTSU二值化简单阀值自适应阀值 图像读写 图像的读取、显示与保存 import cv2 img cv2.imread(r"1.jpg")…

OpenAI推迟ChatGPT高级语音模式发布!谷歌将推出明星网红AI聊天机器人|AI日报

文章推荐 时序预测双飞轮&#xff0c;全面超越Transformer&#xff0c;纯MLP模型实现性能效能齐飞 OpenAI将终止对我国提供API服务&#xff0c;国内大模型将迎来“六小强”格局&#xff01;&#xff5c;AI日报 推迟ChatGPT高级语音模式发布&#xff01;OpenAI将计划在秋季向…

主流先进封装技术介绍

主流先进封装技术介绍 先进封装是指封装集成电路 (IC) 以提高性能的多种创新技术。 本质上&#xff0c;就是将传统封装中被延缓的数据传输速度和被损耗的大量功耗&#xff0c;通过技术和结构的创新极大程度的找回。 1. FO 封装 FO封装包括三大类&#xff1a; 核心扇出型&a…

纯css写一个动态圣诞老人

效果预览 在这篇文章中&#xff0c;我们将学习如何使用CSS来创建一个生动的圣诞老人动画。通过CSS的魔力&#xff0c;我们可以让圣诞老人在网页上摇摆&#xff0c;仿佛在向我们招手庆祝圣诞节和新年。 实现思路 实现这个效果的关键在于CSS的keyframes动画规则以及各种CSS属性…

【Python机器学习】自动化特征选择——单变量统计

添加更多特征会使所有的模型变得更加复杂&#xff0c;从而增大过拟合的可能性。 在添加新特征或处理一般的高位数据集时&#xff0c;最好将特征的数量减少到只包含最有用的那些特征&#xff0c;并删除其余特征&#xff0c;这样会得到泛化能力更好、更简单的模型。 对于如何判…

何用Vue3和Plotly.js打造交互式3D图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 利用 Plotly.js 创建交互式动画图表 应用场景 本代码适用于需要创建交互式动画图表的数据可视化项目。例如&#xff0c;可以用来展示时间序列数据或比较不同函数的行为。 基本功能 该代码使用 Plotly.js 库…

shell编程之免交互(shell脚本)

Here Document 免交互 Here Document 概述 Here Document是一个特殊的用途的代码块。它在linux shell中使用I/O重定向的方式将命令列表提供给交互式程序或命令&#xff0c;比如ftp&#xff0c;cat或read命令。Here Document 是标准输入的一种替代品&#xff0c;可以帮助脚本开…

Vue项目打包优化

Vue项目打包优化 前言 在这篇文章我们讨论Vue项目打包优化&#xff0c;并按步骤展示实际优化过程中的修改和前后对比。 背景 刚开始的打包体积为48.71M 优化 步骤一&#xff1a;删除viser-vue viser-vue底层依赖antv/g2等库一并被删除&#xff0c;目前总体积为46.9M&am…

红酒邂逅时尚,品味生活的双重魅力,引领潮流新风尚

在繁华的都市中&#xff0c;红酒与时尚如同一对孪生姐妹&#xff0c;共同诠释着品味生活的双重魅力。红酒&#xff0c;那深邃的色泽中蕴藏着千年的历史与文化&#xff1b;时尚&#xff0c;那流转的光影中凝聚着时代的潮流与个性。当两者相遇&#xff0c;便碰撞出了特别的火花&a…

PMP培训,哪个机构的通过率高?

有很多培训机构供选择&#xff0c;但要找到适合自己的却很困难。特别是随着PMP参考教材的更新&#xff0c;考试难度增加了&#xff0c;仅靠自学很难与报班的同学竞争。那么在众多PMP培训机构中如何选择最适合自己的呢&#xff1f;有哪些机构是可信赖的呢&#xff1f;下面将介绍…