gpt4 book ai didi

php - 从 DB2 数据库填充 MySQL 数据库

转载 作者:行者123 更新时间:2023-11-29 08:30:48 25 4
gpt4 key购买 nike

我目前有一个用于从 DB2 服务器填充 MySQL 数据库的脚本。它可以工作,但似乎以极慢的速度将行插入 MySQL。脚本运行时,服务器进程的 CPU 占用率约为 1%,我想知道如何加快插入速度。

出于安全原因,DB2数据库的管理员只为我们提供了数据库中所需表的只读 View 。

这是我的脚本:

<?php

$selectQuery = "SELECT
PK AS COL1,
COL2,
COL3,
COL4,
CASE WHEN DATE > '" . date('Y-m-d') . "'
THEN 1
ELSE 0
END AS COL5
FROM table1";

$insertQuery = "INSERT INTO `table1` (
`fk`,
`col2`,
`col3`,
`col4`,
`col5`,
`last_updated`
)
SELECT :col1, f.`fid`, :col3, :col4, :col5, NOW()
FROM f
WHERE f.`code` = :col2
LIMIT 1
ON DUPLICATE KEY UPDATE
`col2` = VALUES(col2),
`col3` = VALUES(col3),
`col4` = VALUES(col4),
`col5` = VALUES(col5),
`last_updated` = NOW();";

$paramTypes = array(
'col1' => PDO::PARAM_STR,
'col2' => PDO::PARAM_STR,
'col3' => PDO::PARAM_STR,
'col4' => PDO::PARAM_STR,
'col5' => PDO::PARAM_BOOL
);

$sync->populate($selectQuery, $insertQuery, $paramTypes);

在同步类中($sync 是其实例的类):

<?php

class SyncObject {
private $db2;
private $db2_user = '...';
private $db2_pass = '...';
private $db2_dbname = '...';
private $db2_host = 'secure.example.net';
private $db2_port = ...;

private $mysql;

public function __construct() {
// Establish a DB2 connection
$this->db2 = db2_pconnect("DATABASE={$this->db2_dbname};HOSTNAME={$this->db2_host};PORT={$this->db2_port};PROTOCOL=TCPIP;UID={$this->db2_user};PWD={$this->db2_pass};", '', '');

// Establish a MySQL connection
$this->mysql = new PDO('mysql:host=secure-mysql.example.net;port=...;dbname=...', '...', '...', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}

public function populate($selectQuery, $insertQuery, $paramTypes = array()) {

$insStmt = $this->mysql->prepare($insertQuery);

foreach ($paramTypes as $parameterName => $parameterType) {

$$parameterName = '';

$insStmt->bindParam(":$parameterName", $$parameterName, $parameterType);
}

// Retrieve the data

$stmt = db2_exec($this->db2, $selectQuery);

while ($row = db2_fetch_assoc($stmt)) {
foreach ($row as $fieldName => &$fieldValue) {

$fieldName = strtolower($fieldName);

$$fieldName = trim($fieldValue);

$insStmt->execute();
}
}
}
}

顺便说一句,这个 populate 方法被调用六次,每个表一次。我在这里只展示了一张 table 。表的大小范围从 20 行到 2100 万行。

我认为我可以在查询中绑定(bind)大写参数,以避免 strtolower 函数全部出现在 foreach 中,但除了这个微小的更改之外,还有什么建议吗关于如何提高脚本的性能?

最佳答案

无论您做什么,按行插入数据都不会表现良好。在我看来,更好的方法是使用 DB2 EXPORT 命令将 DB2 表数据提取到 CSV 文件中,然后使用 MySQL LOAD DATA 将它们加载到目标数据库中。我对 PHP 不太熟悉,但我认为它应该允许您使用 exec() 运行外部命令。

您至少需要安装 DB2 数据服务器运行时客户端,以便能够为 EXPORT 运行 DB2 命令行处理器。

关于php - 从 DB2 数据库填充 MySQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16681510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com