2012-02-28 2 views
0

나는 3 천만개가 넘는 행이있는 MySQL 데이터베이스를 가지고 있지만 일부 행 (적절하게 3 백만)은 중복되어 있습니다. 아래의 PHP 스크립트를 사용하여 데이터베이스를 복사하고 중복을 확인하려고합니다. 그러나 실행 속도가 매우 느립니다. 3 일 그리고 그것의 반 방법 저쪽에, 어쨌든 그것을 가속화하기 위하여 거기 있는가? 나는 MySql 서버 자체에서 스크립트를 실행하고있다.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 "<BODY> 
<script type=\"text/javascript\"> 
<!-- 
window.location = \"/addnew.php?pageno=$nxt&lastpage=$lastpage\" 
//--> 
</script> 
</BODY> 
</HTML>\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 
+0

준비된 문을 빈 post_final 테이블을 생성 할 만듭니다. 하지만 어쨌든 일반 SQL을 사용하여이 작업을 수행 할 수 있습니다. – Rufinus

+0

가장 먼저해야 할 일은 1000 개의 레코드마다 브라우저 요청을 사용하는 것입니다. 두 번째 방법은 모든 레코드에 대해 개별적으로 쿼리를 실행하지 않고이를 수행하는 방법을 찾는 것입니다. – horatio

답변

3

SQL 만 사용하면 SQL과 PHP간에 데이터를 앞뒤로 이동할 필요가 없습니다. 당신이 테이블 post_final있는 데이터베이스 db1을 가정하면, 삽입 도움이 될에 대한 데이터베이스 db2

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