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

从MySQL迁移到PostgreSQL的完整指南

1.引言

在现代数据库管理中,选择合适的数据库系统对业务的成功至关重要。随着企业数据量的增长和对性能要求的提高,许多公司开始考虑从MySQL迁移到PostgreSQL。这一迁移的主要原因包括以下几个方面:

1.1 性能和扩展性

PostgreSQL以其高性能和优秀的扩展能力而闻名。它支持复杂的查询优化和并发控制,能够更高效地处理大规模数据。与MySQL相比,PostgreSQL在处理复杂查询和大数据集时表现更为出色。

1.2. 标准兼容性和功能丰富

PostgreSQL严格遵循SQL标准,并提供了许多高级功能,如完整的ACID事务支持、复杂的查询和索引功能、存储过程、触发器等。其丰富的功能集使得开发人员能够更加灵活地设计和实现各种数据库应用。

1.3. 开源社区和企业支持

PostgreSQL拥有一个活跃的开源社区和广泛的企业支持。无论是社区版本还是企业版本,用户都可以获得及时的技术支持和更新。这使得PostgreSQL在稳定性和安全性方面具有显著优势。

1.4. 迁移过程中的挑战和注意事项

尽管从MySQL迁移到PostgreSQL带来了诸多优势,但这一过程也伴随着一些挑战和注意事项:

1.4.1. 语法差异

MySQL和PostgreSQL在SQL语法上存在一些差异,特别是在存储过程、函数和触发器的实现上。在迁移过程中,需要对现有的SQL脚本进行适当的调整和转换,以确保在PostgreSQL中能够正常运行。

1.4.2. 数据类型兼容性

两者在数据类型的支持和实现上也存在差异。例如,MySQL的TINYINT在PostgreSQL中没有直接对应的类型,需要转换为SMALLINT。类似的差异需要在迁移前进行详细的审查和处理。

1.4.3. 性能优化

尽管PostgreSQL在性能上具有优势,但迁移后仍需要对系统进行性能调优。包括索引的重新创建、查询的优化等,以充分发挥PostgreSQL的性能优势。

1.4.4. 数据完整性验证

在迁移过程中,确保数据的一致性和完整性至关重要。需要进行全面的数据验证,确保迁移后的数据与原数据完全一致。这包括行数验证、数据对比以及存储过程和函数的功能测试。

1.4.5. 工具的选择

选择合适的迁移工具可以显著简化迁移过程。例如,pgloader、Navicat等工具可以帮助大家完成大部份迁移步骤,减少手动干预的错误风险。关于pgloader的工具使用,可以查看pgloader官方文档,在这里就不赘述了,后续如果有需要可以针对pgloader的使用给大家进行分享。

2. 迁移步骤

将数据从一个数据库系统迁移到另一个数据库系统是一个复杂且关键的任务。以下是从MySQL迁移到PostgreSQL的完整过程,涵盖了所有相关步骤。

2.1 准备工作
2.1.1. 安装并配置MySQL和PostgreSQL

在开始迁移之前,确保MySQL和PostgreSQL都已正确安装并配置。准备工作包括安装和配置数据库系统以及备份MySQL数据库。对于Mysql、PostgreSQL的配置安装可以通过yum或者apt命令进行联网安装,也可以通过二进制进行安装,具体可以参考:

  • PostgreSQL16.3基于CentOS7.9源码安装步骤
  • 数据库MySQL的四种安装方式
2.1.2. 备份MySQL数据库

在进行数据迁移之前,必须备份MySQL数据库以防止数据丢失。备份可以使用mysqldump工具完成。

1.备份整个数据库
使用mysqldump命令导出整个数据库,包括表结构和数据。

mysqldump -u root -p your_database > your_database_backup.sql

2.备份单个表
如果只需要备份特定的表,可以使用以下命令:

mysqldump -u root -p your_database table_name > table_name_backup.sql

3.备份存储过程和函数
使用--routines选项导出存储过程和函数。

mysqldump -u root -p --routines --no-create-info --no-data --skip-triggers your_database > routines_backup.sql

4.验证备份文件
确保备份文件已正确生成,并且可以读取。可以简单地查看备份文件的内容:

less your_database_backup.sql

通过完成以上准备工作,可以确保MySQL和PostgreSQL环境已正确设置,并且数据已备份,为接下来的迁移步骤打下基础。

2.2 迁移表结构

在迁移表结构时,数据类型的转换是关键的一步。MySQL和PostgreSQL在数据类型的支持和实现上有一些差异,需要进行适当的映射和转换。以下是常用数据类型的对比:

数据类型对比

MySQL

PostgreSQL

说明

TINYINT

SMALLINT

小范围整数,PostgreSQL没有直接的TINYINT,需要转换为SMALLINT

SMALLINT

SMALLINT

小范围整数

MEDIUMINT

INTEGER

中等范围整数,PostgreSQL没有直接的MEDIUMINT,可以转换为INTEGER

INT

INTEGER

标准整数类型

BIGINT

BIGINT

大范围整数

FLOAT

REAL

单精度浮点数

DOUBLE

DOUBLE PRECISION

双精度浮点数

DECIMAL

DECIMAL

精确的小数

NUMERIC

NUMERIC

精确的小数,等同于DECIMAL

CHAR

CHAR

定长字符串

VARCHAR

VARCHAR

可变长度字符串

TINYTEXT

TEXT

小文本字段,PostgreSQL用TEXT替代

TEXT

TEXT

文本字段

MEDIUMTEXT

TEXT

中等大小文本字段,PostgreSQL用TEXT替代

LONGTEXT

TEXT

大文本字段,PostgreSQL用TEXT替代

DATE

DATE

日期

DATETIME

TIMESTAMP

日期和时间,PostgreSQL用TIMESTAMP替代

TIME

TIME

时间

YEAR

INTEGER

年份,PostgreSQL没有直接的YEAR类型,可以使用INTEGER

ENUM

VARCHAR

枚举类型,PostgreSQL没有直接的ENUM,可以使用VARCHAR

SET

VARCHAR

集合类型,PostgreSQL没有直接的SET,可以使用VARCHAR

BLOB

BYTEA

二进制大对象

TINYBLOB

BYTEA

小二进制对象,PostgreSQL用BYTEA替代

MEDIUMBLOB

BYTEA

中等大小二进制对象,PostgreSQL用BYTEA替代

LONGBLOB

BYTEA

大二进制对象,PostgreSQL用BYTEA替代

迁移步骤:

  1. 导出MySQL表结构: 使用mysqldump命令导出MySQL数据库的表结构。
  2. 转换表结构为PostgreSQL兼容格式: 根据上表中的数据类型对比,手动或使用工具调整导出的SQL文件,确保数据类型在PostgreSQL中正确映射。
  3. 导入到PostgreSQL: 使用psql命令将转换后的表结构导入到PostgreSQL中,创建所需的表和列。

注意事项:

  1. 在进行数据类型转换时,需特别注意数据类型的精度和范围,确保在PostgreSQL中的数据类型能够满足原MySQL数据的需求。
  2. 特殊数据类型的转化,例如:MySQL当中的TINYINT(1)表示Boolean的字段,在PostgreSQL需要转化为Boolean类型;PostgreSQL没有MySQL的BLOB类型,所以需要把BLOB类型转化为BYTEA
2.3 迁移数据

迁移数据是从MySQL到PostgreSQL过程中最关键的一步。这个过程涉及导出MySQL数据、转换数据格式、导入到PostgreSQL以及验证数据的一致性。以下是详细的步骤描述。

2.3.1. 导出MySQL数据

首先,需要将MySQL数据库中的数据导出为一个文件。这可以通过使用mysqldump工具来实现。

导出步骤:

  1. 打开终端。
  2. 使用mysqldump命令导出数据 mysqldump -u [username] -p [database_name] --no-create-info > data_backup.sql 其中:
  • [username]是MySQL的用户名。
  • [database_name]是要导出的数据库名称。
  • --no-create-info选项表示只导出数据,不包括表结构。
2. 转换数据文件格式

由于MySQL和PostgreSQL的数据格式有所不同,需要将导出的MySQL数据文件转换为适合PostgreSQL的格式。pgloader是一个强大的工具,可以简化这个过程。

转换步骤:

  1. 安装pgloader(如果尚未安装): sudo yum install pgloader -y
  2. 使用pgloader进行数据转换和导入:
    pgloader mysql://[username]:[password]@localhost/[database_name] postgresql://[pg_username]:[pg_password]@localhost/[pg_database_name]
    其中:
  • [username][password]是MySQL的用户名和密码
  • [database_name]是MySQL数据库的名称
  • [pg_username][pg_password]是PostgreSQL的用户名和密码
  • [pg_database_name]是PostgreSQL数据库的名称
3. 导入到PostgreSQL

如果没有使用pgloader,需要手动将数据文件导入到PostgreSQL。

导入步骤:

  1. 打开终端。
  2. 使用psql命令导入数据。 psql -U [pg_username] -d [pg_database_name] -f data_backup.sql 其中:
  • [pg_username]是PostgreSQL的用户名。
  • [pg_database_name]是要导入数据的PostgreSQL数据库名称。
  • data_backup.sql是导出的MySQL数据文件。
4. 数据完整性验证

在数据导入后,需要进行数据完整性验证,以确保数据迁移过程中没有丢失或损坏。

验证步骤:

  1. 行数验证:
    在MySQL和PostgreSQL中分别查询每个表的行数,确保行数一致。 SELECT COUNT(*) FROM table_name;
  2. 数据对比:
    随机抽取若干条记录,比较MySQL和PostgreSQL中的数据是否一致。 SELECT * FROM table_name WHERE id = random_id;
  3. 完整性检查
    确保所有外键、唯一约束等数据库完整性规则在 PostgreSQL 中正确实现
  4. 业务逻辑验证
    使用应用程序的业务逻辑进行数据验证。编写脚本或程序调用应用程序接口,验证数据是否符合预期
  5. 数据范围和分布验证
    验证特定列的数据范围和分布是否一致。例如,检查 日期 列的 最小值最大值 是否相同
  6. NULL值验证
    检查各个表中 NULL 值的分布是否一致
  7. 聚合函数验证
    使用聚合函数(如: SUM、AVG、MAX、MIN )验证数据的一致性
  8. 应用程序功能测试
    通过应用程序执行常规操作,验证迁移后的数据是否支持应用程序的正常运行。包括数据 插入、更新、删除和查询 等操作

注意事项:

  1. 字符编码:确保MySQL和PostgreSQL的字符编码一致,避免出现乱码问题。
  2. 事务处理:在数据导入过程中使用事务,以确保数据的一致性和完整性。
  3. 索引和约束:在导入数据前,可以暂时禁用索引和约束,提高数据导入速度。导入完成后再重新在PostgreSQL侧进行重建。
2.4 迁移存储过程和函数

将MySQL的存储过程和函数迁移到PostgreSQL时,需要了解两者之间的系统函数和语法差异。以下是详细的对比表格:

迁移步骤:

  1. 导出MySQL存储过程和函数
    使用mysqldump命令导出MySQL数据库中的存储过程和函数。 mysqldump -u [username] -p --routines --no-create-info --no-data --skip-triggers [database_name] > routines_backup.sql
  2. 转换存储过程和函数为PostgreSQL兼容格式
    手动调整导出的存储过程和函数,使其适应PostgreSQL的语法
  3. 导入到PostgreSQL
    使用psql命令将转换后的存储过程和函数导入到PostgreSQL中。 psql -U [pg_username] -d [pg_database_name] -f routines_backup_pg.sql
2.4.1 系统函数对比

功能

MySQL

PostgreSQL

当前日期和时间

NOW()

CURRENT_TIMESTAMP

当前用户

CURRENT_USER()

CURRENT_USER

字符串长度

CHAR_LENGTH(string)

LENGTH(string)

数学函数

ABS(number), ROUND(number)

ABS(number), ROUND(number)

随机数生成

RAND()

RANDOM()

子字符串

SUBSTRING(string, pos, len)

SUBSTRING(string FROM pos FOR len)

日期加减

DATE_ADD(date, INTERVAL expr unit)

date + interval 'expr unit'

日期格式化

DATE_FORMAT(date, format)

TO_CHAR(date, format)

2.4.2 语法对比

功能/特性

MySQL

PostgreSQL

存储过程定义

CREATE PROCEDURE proc_name (params) BEGIN ... END;

CREATE OR REPLACE PROCEDURE proc_name (params) LANGUAGE plpgsql AS $$ BEGIN ... END; $$;

函数定义

CREATE FUNCTION func_name (params) RETURNS type BEGIN ... END;

CREATE OR REPLACE FUNCTION func_name (params) RETURNS type LANGUAGE plpgsql AS $$ DECLARE ... BEGIN ... END; $$;

参数

输入、输出、输入输出参数

输入参数(默认),使用INOUTINOUT指定

变量声明

DECLARE var_name type;

DECLARE var_name type;DECLARE块中

异常处理

DECLARE ... HANDLER

EXCEPTION

条件控制

IF ... THEN ... ELSE ... END IF;

IF ... THEN ... ELSE ... END IF;

循环控制

WHILE ... DO ... END WHILE;

WHILE ... LOOP ... END LOOP;

结果集处理

SELECT ... INTO var;

SELECT ... INTO var;

2.4.3 示例说明
  • 在MySQL中定义存储过程和函数

    – 存储过程
    DELIMITER //
    CREATE PROCEDURE example_procedure(IN param1 INT)
    BEGIN
    SELECT * FROM example_table WHERE id = param1;
    END //
    DELIMITER ;

    – 函数
    DELIMITER //
    CREATE FUNCTION example_function(param1 INT) RETURNS INT
    BEGIN
    DECLARE result INT;
    SELECT column INTO result FROM example_table WHERE id = param1;
    RETURN result;
    END //
    DELIMITER ;

  • 在PostgreSQL中转换存储过程和函数

    – 存储过程
    CREATE OR REPLACE PROCEDURE example_procedure(param1 INT)
    LANGUAGE plpgsql
    AS B E G I N S E L E C T ∗ F R O M e x a m p l e t a b l e W H E R E i d = p a r a m 1 ; E N D ; BEGIN SELECT * FROM example_table WHERE id = param1; END; BEGINSELECTFROMexampletableWHEREid=param1;END;;

    – 函数
    CREATE OR REPLACE FUNCTION example_function(param1 INT) RETURNS INT
    LANGUAGE plpgsql
    AS D E C L A R E r e s u l t I N T ; B E G I N S E L E C T c o l u m n I N T O r e s u l t F R O M e x a m p l e t a b l e W H E R E i d = p a r a m 1 ; R E T U R N r e s u l t ; E N D ; DECLARE result INT; BEGIN SELECT column INTO result FROM example_table WHERE id = param1; RETURN result; END; DECLAREresultINT;BEGINSELECTcolumnINTOresultFROMexampletableWHEREid=param1;RETURNresult;END;;

2.4.3 存储过程和函数测试

迁移完成后,存储过程和函数的测试是确保迁移成功的重要步骤。测试的目的是验证在PostgreSQL中存储过程和函数的功能是否与在MySQL中一致,主要从如下几方面进行测试验证:

  1. 功能测试
    需要确保每个存储过程和函数在PostgreSQL中按预期工作。可以通过创建测试用例来调用每个存储过程和函数,并验证其输出是否正确。例如,对于存储过程get_user_by_id,可以在PostgreSQL中执行CALL get_user_by_id(1);,并检查返回结果是否正确。
  2. 性能测试
    对比MySQL和PostgreSQL中存储过程和函数的执行时间,确保性能没有显著下降。这可以通过在两个数据库中分别执行相同的存储过程或函数,并记录其执行时间来实现。例如,在MySQL中执行CALL get_user_by_id(1);,然后在PostgreSQL中执行相同的命令,并比较执行时间。
  3. 边界测试
    测试存储过程和函数的边界情况,如最大和最小输入值,空值处理,异常情况等。例如,可以在PostgreSQL中执行CALL
    get_user_by_id(NULL);、CALL get_user_by_id(-1);和CALL
    get_user_by_id(99999999);,以确保存储过程和函数能够正确处理各种输入情况。
  4. 集成测试
    通过应用程序执行常规操作,验证迁移后的数据是否支持应用程序的正常运行。这包括在应用程序中调用存储过程和函数,并验证结果是否与预期一致。例如,在Java应用程序中,通过JDBC连接到PostgreSQL数据库,调用存储过程get_user_by_id,并检查返回结果是否正确。
3.注意事项

数据的迁移大多都是基于实际的生成环境中进行,为了尽可能减少对于业务的影响,我们应该通过细致的规划和执行,合理的停机时长规划、应用改造和生产环境验证等来确保迁移过程的顺利和成功,最大程度地减少对业务的影响,一下为在整个迁移过程中需要考虑的注意事项:

1.停机时长的考虑
迁移过程中,停机时长是一个重要的考虑因素。数据量越大,迁移所需的时间越长。因此,建议在数据量较少或业务低峰期进行迁移,以减少对生产环境的影响。为了确保数据的一致性,在停机前需要备份所有数据,并确保在迁移过程中不进行数据修改。
2.缩短停机时间的方法
为了尽可能缩短停机时间,可以考虑使用增量备份和恢复的方法,减少全量数据备份和恢复所需的时间。此外,提前准备好迁移所需的脚本和配置,可以减少实际迁移操作的时间。
3.代码兼容性
迁移过程中,需要修改应用程序的数据库连接配置,确保连接到PostgreSQL。同时,检查并修改应用程序中所有的SQL查询,确保其在PostgreSQL中能够正确执行。尤其注意MySQL特有的语法和函数,需替换为PostgreSQL兼容的语法和函数。
4.功能验证
迁移完成后,需要进行功能验证。编写和执行单元测试,确保应用程序中的所有功能在使用PostgreSQL时能够正常运行。此外,在测试环境中进行全面的集成测试,模拟生产环境中的实际操作,确保所有业务流程能够正常执行。
5.数据验证
数据验证是迁移过程中的关键步骤。使用行数验证、数据对比、校验和验证等方法,确保迁移后数据的完整性和一致性。同时,验证特定列的数据范围和分布是否一致,如日期列的最小值和最大值是否相同。
6.性能验证
性能验证也是迁移过程中不可忽视的一部分。对比迁移前后关键查询的执行时间,确保PostgreSQL中的查询性能满足需求。通过性能测试,确保PostgreSQL中的存储过程和函数的执行时间在可接受范围内。
7.系统稳定性
为了确保系统的稳定性,建议在生产环境中进行压力测试,验证系统在高负载下的稳定性和性能。同时,设置详细的监控和日志记录,及时发现和解决潜在的问题。
8.关键注意事项
在进行任何迁移操作前,务必做好全面的数据备份,以防迁移过程中出现数据丢失或损坏的情况。制定详细的迁移计划,包括每个步骤的时间安排、责任人和应急预案。如果可能,分阶段逐步实施迁移,逐步验证每个阶段的结果,以降低整体迁移的风险。

总结

从MySQL迁移到PostgreSQL是一个复杂但必要的过程,它能够为系统带来更高的性能、丰富的功能集和更强的扩展能力。整个迁移过程包括准备工作、迁移表结构、迁移数据、迁移存储过程和函数以及数据完整性验证。在每个步骤中都需要细致的规划和执行,以确保数据的一致性和完整性。

在迁移过程中,需要仔细考虑停机时长、应用改造以及生产环境中的实际验证。停机时长的规划直接影响业务的连续性,建议在业务低峰期进行迁移,并使用增量备份和恢复的方法以缩短停机时间。应用改造方面,需修改数据库连接配置和SQL查询,确保兼容PostgreSQL。生产环境验证是确保迁移成功的关键步骤,包括数据验证、性能验证和系统稳定性测试。通过行数验证、数据对比、校验和验证等方法,可以确保数据的完整性和一致性。同时,性能测试和压力测试能够确保系统在迁移后的高效稳定运行。

通过细致的规划和执行,从MySQL迁移到PostgreSQL不仅能够提升系统性能,还能为未来的发展打下坚实的基础。希望本文提供的详细步骤和注意事项能够帮助您顺利完成迁移过程,实现系统的平稳过渡和功能增强。

参考链接

以下是一些关于从MySQL迁移到PostgreSQL的参考文章和链接,这些资源可以为您提供更多的技术细节:

  • PostgreSQL Official Documentation
  • MySQL to PostgreSQL Migration Guide
  • pgloader Documentation
  • mysqldump Documentation

相关文章:

从MySQL迁移到PostgreSQL的完整指南

1.引言 在现代数据库管理中,选择合适的数据库系统对业务的成功至关重要。随着企业数据量的增长和对性能要求的提高,许多公司开始考虑从MySQL迁移到PostgreSQL。这一迁移的主要原因包括以下几个方面: 1.1 性能和扩展性 PostgreSQL以其高性能…...

20250214 随笔 Nginx 负载均衡在数据库中的应用

Nginx 负载均衡在数据库中的应用 在高并发环境下,数据库的性能往往是系统的瓶颈。为了提高数据库的吞吐能力、优化请求分配、减少单点故障,我们可以使用 Nginx 负载均衡 来优化数据库的访问。本文将介绍如何使用 Nginx 进行数据库负载均衡,以…...

从养殖场到科技前沿:YOLOv11+OpenCV精准计数鸡蛋与鸡

前言 谁能想到,鸡蛋和鸡的计数居然能变成一项高科技活儿?想象一下,早上去市场,卖家把鸡蛋摔得稀巴烂,结果鸡蛋滚得到处都是——难道你就得一个个捡回来数?还得小心别弄错?可是,你又不是超人!别担心,科技来帮忙!今天的主角是YOLOv11和OpenCV,它们是计算机视觉领域的…...

【Qt】 Data Visualization

三维数据可视化 三维柱状图三维图的创建程序截图示例代码 三维散点图三维图创建程序截图示例代码 三维曲面图三维图创建程序截图示例代码 Data Visualization 是 Qt 中的一个三维数据可视化模块,可用于绘制三维柱状图、三维散点图和三维曲面。与 Charts 模块类似&am…...

python基础语法

文章目录 字面量定义分类 注释定义分类单行注释多行注释 变量定义 数据类型类型转换定义 案例 标识符定义命名规则内容限定大小写敏感不可使用关键字 命名规范变量的命名规范 运算符数学运算符赋值运算符复合赋值运算符 定义字符串定义方式 字符串拼接语法 字符串格式化语法1字…...

【C++游戏开发-五子棋】

使用C开发五子棋游戏的详细实现方案,涵盖核心逻辑、界面设计和AI对战功能: 1. 项目结构 FiveChess/ ├── include/ │ ├── Board.h // 棋盘类 │ ├── Player.h // 玩家类 │ ├── AI.h // AI类 │ └── Game.h // 游戏主逻辑 ├── src/ …...

C/C++ | 每日一练 (2)

💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 C/C | 每日一练 (2)题目参考答案封装继承多态虚函数底…...

如何在 VS Code 中快速使用 Copilot 来辅助开发

在日常开发中,编写代码往往是最耗时的环节之一。而 GitHub Copilot,作为一款 AI 编码助手,可以帮助开发者 自动补全代码、生成代码片段,甚至直接编写完整的函数,大幅提升编码效率。那么,如何在 VS Code 中快…...

FFmpeg源码:av_strlcpy函数分析

一、引言 在C/C编程中经常会用到strcpy这个字符串复制函数。strcpy是C/C中的一个标准函数,可以把含有\0结束符的字符串复制到另一个地址空间。但是strcpy不会检查目标数组dst的大小是否足以容纳源字符串src,如果目标数组太小,将会导致缓冲区…...

【生产变更】- 集群中配置SCAN ip的不同端口应用

【生产变更】- 集群中配置SCAN ip的不同端口应用 一、概述二、操作步骤三、故障解决 一、概述 使用非默认端口(1521)监听scan ip。 二、操作步骤 1、添加11521端口 srvctl add listener -l lis11521 -o /opt/grid/products/11.2.0 -p 11521 srvctl st…...

RabbitMQ 3.12.2:单节点与集群部署实战指南

前言:在当今的分布式系统架构中,消息队列已经成为不可或缺的组件之一。它不仅能够实现服务之间的解耦,还能有效提升系统的可扩展性和可靠性。RabbitMQ 作为一款功能强大且广泛使用的开源消息中间件,凭借其高可用性、灵活的路由策略…...

Node.js技术原理分析系列——如何在Node.js中新增一个内置模块

本文由体验技术团队曹杨毅原创。 Node.js 是一个开源的、跨平台的JavaScript运行时环境,它允许开发者在服务器端运行JavaScript代码。Node.js 是基于Chrome V8引擎构建的,专为高性能、高并发的网络应用而设计,广泛应用于构建服务器端应用程序…...

从低清到4K的魔法:FlashVideo突破高分辨率视频生成计算瓶颈(港大港中文字节)

论文链接:https://arxiv.org/pdf/2502.05179 项目链接:https://github.com/FoundationVision/FlashVideo 亮点直击 提出了 FlashVideo,一种将视频生成解耦为两个目标的方法:提示匹配度和视觉质量。通过在两个阶段分别调整模型规模…...

康耐视CAM-CIC-10MR-10-GC工业相机

康耐视(COGNEX)的工业相机CAM-CIC-10MR-10-GC是CAM-CIC-10MR系列中的一款型号,主要应用于工业自动化检测和高精度视觉系统 基本参数与特性 分辨率与帧率: CAM-CIC-10MR-10-GC属于康耐视CIC系列,具备10MP(1000万像素)的分辨能力,帧率为10fps。该系列相机支持卷帘快门(R…...

解惑Python:一文解决osgeo库安装失败问题

Osgeo(Open Source Geospatial Foundation)是一个支持开源地理空间数据处理的基金会,我们可以在python中使用“osgeo”库来访问其提供的高效地理空间数据。例如,我们使用该模块提供的GDAL处理栅格数据,使用OGR处理矢量…...

3、树莓派5 安装VNC查看器 开启VNC服务器

在前序文章中( 2、树莓派5第一次开机),可以使用三种方式开机,其中使用网线及wifi的方式均需要使用到VNC查看器进行远程桌面控制,本文将介绍如何下载安装并配置及使用VNC查看器及服务器,对前序文章做一些补充…...

Django 创建表时 “__str__ ”方法的使用

在 Django 模型中,__str__ 方法是一个 Python 特殊方法(也称为“魔术方法”),用于定义对象的字符串表示形式。它的作用是控制当对象被转换为字符串时,应该返回什么样的内容。 示例: 我在初学ModelForm时尝…...

STM32 CAN过滤器配置和应用方法介绍

目录 概述 一、CAN过滤器核心概念 二、过滤器配置步骤(以标准ID为例) 三、不同模式的配置示例 四、高级配置技巧 五、调试与问题排查 六、关键计算公式 总结 概述 在STM32微控制器中,CAN过滤器可以配置为标识符屏蔽模式和标识符列表模…...

【第1章:深度学习概览——1.3 深度学习的核心组件与概念解析之神经网络基础】

大家好!今天咱们一头扎进深度学习的神秘领域,好好探索一下其最重要的基石 —— 神经网络。不管你是深度学习的新手小白,还是已经接触过一些基础概念,这篇文章都能助力你更透彻地理解神经网络的原理和运作机制。咱们从最基础的知识入手,一步步揭开神经网络的神秘面纱! 一、…...

Python中如何进行数据库连接?

在 Python 中进行数据库连接,不同的数据库需要使用不同的库。下面分别介绍几种常见数据库(SQLite、MySQL、PostgreSQL)的连接方法。 1. 连接 SQLite 数据库 SQLite 是一种轻量级的嵌入式数据库,Python 标准库中自带了sqlite3模块…...

解析 WebGPU 中 device.createBuffer 的参数意义

在 WebGPU 开发里,device.createBuffer 方法扮演着至关重要的角色,它用于创建一个 GPU 缓冲区对象,这个对象能够存储顶点数据、索引数据、统一数据等。下面我们就来详细剖析该方法各个参数的意义。 1. size:决定缓冲区容量 size …...

PLC的集成RAM,存储器卡,用户程序存储空间,数据存储容量分别指的什么,有什么关联?

1. 集成RAM 定义:集成RAM(随机存取存储器)是PLC内部的高速易失性存储器,用于临时存储运行时的数据(如输入/输出状态、中间变量、计数器/定时器的当前值等)。 特点: 易失性:断电后数…...

BFS-FloodFill 算法 解决最短路问题 多源 解决拓扑排序

文章目录 一、FloodFill 算法[733. 图像渲染](https://leetcode.cn/problems/flood-fill/description/)2.思路3.代码 [200. 岛屿数量](https://leetcode.cn/problems/number-of-islands/description/)2.思路3.代码 [LCR 105. 岛屿的最大面积](https://leetcode.cn/problems/ZL6…...

USB2.03.0接口区分usb top工具使用

一. USB2.0 & 3.0接口支持区分 1.1. 颜色判断 USB接口的颜色并不是判断版本的可靠标准,但根据行业常见规范分析如下: USB接口颜色与版本对照表: 接口颜色常见版本内部触点数量传输速度黑色USB2.04触点480 Mbps (60 MB/s)白色USB2.0(多…...

2025百度快排技术分析:模拟点击与发包算法的背后原理

一晃做SEO已经15年了,2025年还有人问我如何做百度快速排名,我能给出的答案就是:做好内容的前提下,多刷刷吧!百度的SEO排名算法一直是众多SEO从业者研究的重点,模拟算法、点击算法和发包算法是百度快速排名的…...

idea 2019.3常用插件

idea 2019.3常用插件 文档 idea 2019.3常用插件idea 2023.3.7常用插件 idea 2019.3常用插件 插件名称插件版本说明1AceJump3.5.9AceJump允许您快速将插入符号导航到编辑器中可见的任何位置。只需按“ctrl;”,键入一个字符,然后在Ace Jump…...

【Python 学习 / 5】函数详解(定义、参数、作用域、lambda、内置函数)

文章目录 一、函数1. 定义函数1.1 基本函数定义1.2 带参数的函数1.3 带返回值的函数 2. 参数传递2.1 位置参数2.2 默认参数2.3 可变参数2.3.1 使用*args2.3.2 使用**kwargs 2.4 参数的混合使用 3. 作用域3.1 局部和全局变量3.2 global 关键字输出: 3.3 nonlocal关键…...

WPF7-数据绑定基础

1. WPF数据绑定试验 1.1. 数据绑定的核心实现1.2. {Binding}语法1.3. 理解 DataContext 1. WPF数据绑定试验 以下是一个简单的 WPF 数据绑定示例,使用两个TextBox控件分别表示Name和Age来进行进行数据绑定试验。 数据模型类 创建一个 Person 类,包含…...

http 与 https 的区别?

HTTP(超文本传输协议)和 HTTPS(安全超文本传输协议)是互联网通信的基础协议。随着网络技术的发展和安全需求的提升,HTTPS变得越来越重要。本文将深入探讨HTTP与HTTPS之间的区别,包括其工作原理、安全性、性能、应用场景及未来发展等。 1. HTTP与HTTPS的基本概念 1.1 HT…...

大数据学习(49) - Flink按键分区状态(Keyed State)

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦&#x1f91…...

IP 路由基础 | 路由条目生成 / 路由表内信息获取

注:本文为 “IP 路由” 相关文章合辑。 未整理去重。 IP 路由基础 秦同学学学已于 2022-04-09 18:44:20 修改 一. IP 路由产生背景 我们都知道 IP 地址可以标识网络中的一个节点,并且每个 IP 地址都有自己的网段,各个网段并不相同&#xf…...

COBOL语言的移动应用开发

COBOL语言的移动应用开发探讨 引言 在信息技术快速发展的今天,移动应用开发已成为各行各业不可或缺的一部分。许多企业和开发者纷纷转向使用新兴的编程语言和开发工具,以满足不断变化的用户需求。然而,作为一种历史悠久的编程语言&#xff…...

TCP协议(Transmission Control Protocol)

TCP协议,即传输控制协议,其最大的特征就是对传输的数据进行可靠、高效的控制,其段格式如下: 源端口和目的端口号表示数据从哪个进程来,到哪个进程去,四位报头长度表示的是TCP头部有多少个4字节,…...

C语言数组之二维数组

C语言 主要内容 数组 二维数组 数组 二维数组 定义 二维数组本质上是一个行列式的组合,也就是说二维数组由行和列两部分组成,属于多维数组。二维数组数据是通过行列进行解读。二维数组可被视为一个特殊的一维数组,相当于二维数组又是一…...

计算机专业知识【软件开发中的常用图表:E - R图、HIPO、DFD、N - S、PAD详解】

在软件开发过程中,有许多种图表工具被用于不同阶段的设计和分析,帮助开发者更清晰地理解系统结构、数据流程和算法逻辑。下面将详细介绍E - R图、HIPO图、DFD图、N - S图和PAD图,包括它们的样子和用途。 一、E - R图(实体 - 联系…...

多人协同开发 —— Git Aoneflow工作流

一、Aoneflow工作流核心架构 #mermaid-svg-rwTOe9qYwzG3wkdy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-rwTOe9qYwzG3wkdy .error-icon{fill:#552222;}#mermaid-svg-rwTOe9qYwzG3wkdy .error-text{fill:#552222…...

VSCode运行Go程序报错:Unable to process `evaluate`: debuggee is running

如果使用默认的VSCode的服务器来运行Go程序,那么使用fmt.Scan函数输入数据的时候就会报错,我们需要修改launch.json文件,将Go程序运行在shell终端上。 main.go package mainimport "fmt"func main() {var n intfmt.Scan(&n)v…...

Mybatis高级(动态SQL)

目录 一、动态SQL 1.1 数据准备&#xff1a; 1.2 <if>标签 1.3<trim> 标签 1.4<where>标签 1.5<set>标签 1.6 <foreach>标签 1.7<include> 标签 一、动态SQL 动态SQL是Mybatis的强⼤特性之⼀&#xff0c;能够完成不同条件下不同…...

在 Vue 3 中使用 Lottie 动画:实现一个加载动画

在现代前端开发中&#xff0c;动画是提升用户体验的重要元素之一。Lottie 是一个流行的动画库&#xff0c;它允许我们使用 JSON 文件来渲染高质量的动画。本文将介绍如何在 Vue 3 项目中集成 Lottie 动画&#xff0c;并实现一个加载动画效果。 如果对你有帮助请帮忙点个&#x…...

建筑行业安全技能竞赛流程方案

一、比赛时间&#xff1a; 6月23日8&#xff1a;30分准时到场&#xff1b;9&#xff1a;00&#xff0d;10&#xff1a;00理论考试&#xff1b;10&#xff1a;10-12:00现场隐患答疑&#xff1b;12:00-13&#xff1a;30午餐&#xff1b;下午13&#xff1a;30-15&#xff1a;30现场…...

Mybatisplus自定义sql

文章目录 引言流程 引言 mybatisplus最擅长的将where里面的语句给简便化&#xff0c;而不用我们自己写标签来实现条件查询 但是很多公司规范我们将sql写在mapper层中&#xff0c;不能写在service中 而且一些语句查询的不同select count(*) xxx from xxx 也难以用mp来实现 如何…...

情书网源码 情书大全帝国cms7.5模板

源码介绍 帝国cms7.5仿《情书网》模板源码&#xff0c;同步生成带手机站带采集。适合改改做文学类的网站。 效果预览 源码获取 情书网源码 情书大全帝国cms7.5模板...

基于Unity引擎的网络通信架构深度解析——以NetworkConnectionController为例

一、架构概览与设计理念 本文将以重构后的NetworkConnectionController为核心&#xff0c;深入分析基于Unity引擎的MMO网络通信架构设计。该模块采用分层设计思想&#xff0c;通过连接池管理、流量控制、心跳监测等多维度技术手段&#xff0c;构建了一个高性能、可扩展的网络通…...

C#学习之DataGridView控件

目录 一、DataGridView控件常用属性、方法、事件汇总表 1. 常用方法、属性和事件汇总 二、DataGridView 控件的常用方法调用 1. DataBind() 方法 2. Clear() 方法 3. Refresh() 方法 4. Sort() 方法 5. ClearSelection() 方法 6. BeginEdit() 方法 7. EndEdit() 方法…...

midjourney 一 prompt 提示词

midjourney 不需要自然语言的描述&#xff0c;它只需要关键词即可。 一个完整的Midjourney prompt通常包括三个部分 图片提示&#xff08;Image Prompts&#xff09;、文本提示&#xff08;Text Prompt&#xff09;和参数&#xff08;Parameters&#xff09;。 1、图片提示(…...

谈谈 wait 和 notify

目录 1 wait()方法 2 notify()⽅法 3 wait 和 sleep 的区别 多线程调度是随机的, 很多时候希望多个线程能够按照咱们规定的顺序来执行. 完成线程之间的配合工作. wait和notify就是一个用来协调线程顺序的重要工具. 这俩方法都是 Object 提供的方法. 随便找个对象&#xff0…...

250214-java类集框架

引言 类集框架本质上相当于是容器&#xff0c;容器装什么东西由程序员指定 1.单列集合 单列集合是list和set&#xff0c;list的实现类有ArrayList和LinkedList&#xff0c;前者是数组实现&#xff0c;后者是链表实现。list和set&#xff0c;前者有序、可重复&#xff0c;后者…...

Python学习心得异常处理

有些代码在操作的过程当中&#xff0c;如果不注意其所限定的条件&#xff0c;可能在输入函数值时引发一些程序的报错&#xff0c;这样为了让代码自己能做到抛除异常操作的情况&#xff0c;就得让代码具有排除异常的能力。下面的一些操作就使得代码具有该功能&#xff0c;处理异…...

【机器学习】线性回归 多项式线性回归

【机器学习系列】 KNN算法 KNN算法原理简介及要点 特征归一化的重要性及方式线性回归算法 线性回归与一元线性回归 线性回归模型的损失函数 多元线性回归 多项式线性回归 多项式线性回归 V1.0多项式回归多项式回归的公式 特征代换超越函数作为特征向量维度 V1.0 多项式回归 …...

链表和list

链表和list ‍ ​ ​ ​ ​ ​ ​ ​ ​ ​ 算法题中的经典操作&#xff1a;用空间代替时间​ ​ ​ ​ 双链表头插顺序&#xff1a; 1.先修改新结点的左右指针 2.然后修改结点y的左指针 3.最后修改哨兵位的右指针 双链表在任意位置&#xff08;p&#xff09;之后插入…...