2013-07-19 2 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

Вы можете попробовать создать указатель в столбце "страна" таблицы Ссылка.