2013-07-19 36 views
0

我想從MySQL中的數據庫中讀取數據,並將數據插入到MySQL中的其他數據庫中。MySQL和INSERT IGNORE

我的第一個表是這樣的

CREATE TABLE IF NOT EXISTS `link` (
    `_id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `country` varchar(30) COLLATE utf8 DEFAULT NULL, 
    `time` varchar(20) COLLATE utf8 DEFAULT NULL, 
    `link` varchar(100) COLLATE utf8 DEFAULT NULL, 
    PRIMARY KEY (`_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6149 ; 

,第二個表是

CREATE TABLE IF NOT EXISTS `country` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `Name` varchar(15) CHARACTER SET utf8 NOT NULL, 
    `Logo` varchar(50) CHARACTER SET utf8 DEFAULT NULL, 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `Name_3` (`Name`), 
    UNIQUE KEY `ID` (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8457 ; 

有第一表格約6114行,我試圖插入到第二個使用此代碼

<?php 

$tmp = mysqli_connect(******, *****, ****, *****); // First table in here 

if (mysqli_connect_errno()) { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 

$main = mysqli_connect(*****, *****, ****, ******); //Second table in here 

if (mysqli_connect_errno()) { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 

$req = "SELECT country FROM link"; 
$result = mysqli_query($tmp, $req) or die(mysqli_error($tmp)); 

echo "-> ".mysqli_num_rows($result)."<br>"; 

while ($row = mysqli_fetch_array($result)) { 
    $con = $row["country"]; 

    $req = "INSERT IGNORE INTO country (Name) VALUES ('$con')"; 
    mysqli_query($main, $req) or die(mysqli_error($main)) ; 

} 
?> 

問題是php代碼的作品,但對於6114需要很長的時間,我不能相關rd。 什麼導致代碼需要這麼長時間才能工作?它是「INSERT IGNORE」嗎? 有什麼辦法可以做得更快?

+0

這些數據庫在同一臺服務器上嗎?如果是這樣,你有沒有考慮過['INSERT ... SELECT'](http://dev.mysql.com/doc/en/insert-select.html)? – eggyal

+0

是的數據庫在同一臺服務器上,不,我沒有,比「INSERT IGNORE」更快嗎? – N3mo

+0

'IGNORE'不會加快速度(也可以與'INSERT ... SELECT'一起使用) - 它只是忽略插入過程中發生的任何錯誤。 – eggyal

回答

4

由於數據庫是在同一臺服務器上,你可以簡單地使用INSERT ... SELECT(這避免了必須把數據轉換成PHP和遍歷執行爲每個單獨的數據庫命令的結果,所以會相當更快) :

INSERT INTO db2.country (Name) SELECT country FROM db1.link 
1

你可以嘗試創建一個錶鏈接列「國家」的索引。