我目前有一個用於從DB2服務器填充MySQL數據庫的腳本。它可以工作,但它似乎以極低的速度將行插入到MySQL中。當腳本運行時,服務器進程在〜1%的CPU上執行,我想知道如何加速插入。從DB2數據庫填充MySQL數據庫
出於安全原因,DB2數據庫的管理員僅向我們提供了數據庫中所需表的只讀視圖。
這是我的腳本:
<?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->填充($ 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
方法被調用六次,每一次表。我只在這裏展示過一張桌子。表格的大小從20行到2100萬行不等。
我在想,我可以在查詢中綁定大寫參數,以避免strtolower
函數全部在foreach
中,但除了那個小改動之外,有沒有關於如何提高腳本性能的建議?
+1同意轉儲+批量導入一定是更好的方式 –
目前,這是不是一種選擇,對於我們,因爲我們對服務器幾乎沒有控制權,但是當我們遷移到較新的服務器時,我會牢記這一建議。謝謝! –