Копирование базы данных MySQL ускорилось?

У меня есть база данных MySql с чуть более 30 миллионов строк, но некоторые из строк (соответственно 3 миллиона) дублируются. Я использую сценарий php ниже, чтобы скопировать базу данных и проверить наличие дубликатов, но она работает очень медленно за 3 дня и его даже не на полпути, есть ли способ ускорить его? Я запускаю скрипт на сервере MySql.

<!--?php

$dbhost = "localhost" ;


$con = mysql_connect("$dbhost","$dbuser","$dbpass");
if (!$con)
 {
 die('Could not connect: ' . mysql_error());
 }

mysql_select_db("$dbame", $con);

$server_self = $_SERVER['PHP_SELF'];
$rows_per_page = 1000;
$dbname_var = post1;




//paging script
$query = "SELECT count(*) FROM $dbname_var"; //change!!
//paging script



//PAGING SCRIPT
if (isset($_GET['pageno'])) {
 $pageno = $_GET['pageno'];
} else {
 $pageno = 1;
} // if


$resulta = mysql_query($query) or trigger_error("SQL", E_USER_ERROR);
$query_data = mysql_fetch_row($resulta);



$numrows = $query_data[0];
$lastpage = ceil($numrows/$rows_per_page);

$pageno = (int)$pageno;
if ($pageno --> $lastpage) {
 $pageno = $lastpage;
} // if
if ($pageno < 1) {
 $pageno = 1;
} // if

$limit = 'LIMIT ' .($pageno - 1) * $rows_per_page .',' .$rows_per_page;
$nextpage = $pageno+1;
$prevpage = $pageno-1;







$result = mysql_query("SELECT * FROM $dbname_var $limit");
while($row = mysql_fetch_array( $result )) {


$as = $row[1];
$ad = $row[2];
$af = $row[10];

//CHECK IF THE ROW ALREADY EXISTS IN THE TABLE
$resultdb1 = mysql_query("SELECT * FROM post_final WHERE
add1='$as' AND
add2='$ad' AND
add10='$af'");

$num_rowsdb1 = mysql_num_rows($resultdb1);

//IF IT DOSENT ADD IT!
if($num_rowsdb1 < 1) {

mysql_query("INSERT INTO post_final (add1,
 add2,
 add3,
 add4,
 add5,
 add6,
 add7,
 add8,
 add9,
 add10)
VALUES ('$row[1]',
 '$row[2]',
 '$row[3]',
 '$row[4]',
 '$row[5]',
 '$row[6]',
 '$row[7]',
 '$row[8]',
 '$row[9]',
 '$row[10]')");
} }







$nxt = $_GET['pageno'] + 1;



if ($_GET['pageno'] < $lastpage) {

print "


\n"; }

?>

# Column Type Collation Attributes Null Default Extra Action
 1 ID int(10) No None AUTO_INCREMENT Change Drop More 
 2 add1 varchar(50) latin1_german2_ci No None Change Drop More 
 3 add2 varchar(50) latin1_german2_ci No None Change Drop More 
 4 add3 varchar(50) latin1_german2_ci No None Change Drop More 
 5 add4 varchar(50) latin1_german2_ci No None Change Drop More 
 6 add5 varchar(50) latin1_german2_ci No None Change Drop More 
 7 add6 varchar(50) latin1_german2_ci No None Change Drop More 
 8 add7 varchar(50) latin1_german2_ci No None Change Drop More 
 9 add8 varchar(50) latin1_german2_ci No None Change Drop More 
 10 add9 varchar(50) latin1_german2_ci No None Change Drop More 
 11 add10 varchar(50) latin1_german2_ci No None Change Drop More 

Action Keyname Type Unique Packed Column Cardinality Collation Null Comment
 Edit Drop PRIMARY BTREE Yes No ID 10044279 A 
 Edit Drop add10 BTREE No No add10 590839 A 
 Edit Drop add1 BTREE No No add1 264323 A 
 Edit Drop add2 BTREE No No add2 233587 A
1 ответ

Используйте только SQL, нет необходимости брать данные обратно и вперед между SQL и PHP. Предполагая, что у вас есть база данных db1 со столом post_final, создайте базу данных db2 создайте пустую таблицу post_final и сделайте

INSERT INTO 'db2'.'post_final' (add1, add2, ...., add10) 
SELECT DISTINCT add1, add2, ... , add10 FROM 'db1'.'post_final'

licensed under cc by-sa 3.0 with attribution.