繁体   English   中英

PHP - 从 SQL Server 和 MySQL 同步两个相同的表并仅插入差异,但代码运行速度非常慢

[英]PHP - Syncing two identical tables from SQL Server and MySQL and inserting only the differences, but code runs very slowly

我当前代码的工作方式是,它从第一个数据库(SQL Server)中选择所有数据,然后从 MySQL 中选择所有数据,然后仅插入差异。 问题在于包含超过 70k+ 行和照片文件的表,它运行速度非常慢并且消耗大量内存。 以下是其中一个较小表中的示例代码:

$mssql_array = array();
$ms_sql = "SELECT * FROM SALARY";
$mssql_query = sqlsrv_query($conn_mssql , $ms_sql);

while($row = sqlsrv_fetch_array($mssql_query))
{

  $mssql_array[] = array('SGRADE' => $row['SGRADE'], 'STEP' => $row['STEP'], 'AMOUNT' => $row['AMOUNT'], 'REMARK' => $row['REMARK'], 'unique' => $row['unique']);

}

foreach($mssql_array as $key => $value)
{

   //SELECT FROM MySQL DB
   $my_sql = " SELECT * FROM SALARY WHERE SGRADE ='".$value['SGRADE']."' AND STEP = '".$value['STEP']."' AND AMOUNT = '".$value['AMOUNT']."' AND REMARK = '".$value['REMARK']."' AND `unique` = '".$value['unique']."' ";
   $mysql_query = mysqli_query($conn_mysql , $my_sql);
   $num_rows = mysqli_num_rows($mysql_query);

   $sql = $conn_mysql->prepare("INSERT INTO salary VALUES (?, ?, ?, ?, ?)"); 
   $sql->bind_param("sidsi", $SGRADE, $STEP, $AMOUNT, $REMARK, $unique);
   $SGRADE = $value['SGRADE'];
   $STEP = $value['STEP'];
   $AMOUNT = $value['AMOUNT'];
   $REMARK = $value['REMARK'];
   $unique = $value['unique'];

   if ($num_rows == 0)
   {
     //INSERT INTO MySQL DB
     $sql->execute();
   }
}

虽然它对于小表的工作速度非常快(不到 5 秒),但对于大表,它需要大约 2-3 小时(300k+ 行,60 列)。 我有一些想法可能会使此代码更快,即对 SQL Server 表的主键列(上表中的“唯一”)执行 select max(*) 查询,仅获取最后一行的“唯一”编号并将其与 MySQL 的最后一行的“唯一”进行比较。 如果 SQL Server 的“唯一”列值高于 MySQL,则它会在两个表之间插​​入所有不匹配的记录。 问题是,我不知道如何将其转换为代码,或者是否可能。 与我上面使用的相比,我可以使用任何想法或替代方案吗?

这是我制作的新代码:

$mssql_result = sqlsrv_query($conn_mssql, "SELECT MAX([unique]) FROM salary");
$mssql_row = sqlsrv_fetch_array($mssql_result);
echo $mssql_row[0];

$mysql_result = mysqli_query($conn_mysql, "SELECT MAX(`unique`) FROM salary");
$mysql_row = mysqli_fetch_array($mysql_result);
echo $mysql_row[0];

if($mssql_row[0] != $mysql_row[0])
{
  //SELECT FROM SQL SERVER DB
  $mssql_array = array();
  $ms_sql = "SELECT * FROM SALARY where [unique] > $mysql_row[0]";
  $mssql_query = sqlsrv_query($conn_mssql , $ms_sql);

  while($row = sqlsrv_fetch_array($mssql_query))
  {
    $mssql_array[] = array('SGRADE' => $row['SGRADE'], 'STEP' => $row['STEP'], 'AMOUNT' => $row['AMOUNT'], 'REMARK' => $row['REMARK'], 'unique' => $row['unique']);
  }

  foreach($mssql_array as $key => $value)
  {
    $sql = $conn_mysql->prepare("INSERT INTO salary VALUES (?, ?, ?, ?, ?)"); 
    $sql->bind_param("sidsi", $SGRADE, $STEP, $AMOUNT, $REMARK, $unique);
    $SGRADE = $value['SGRADE'];
    $STEP = $value['STEP'];
    $AMOUNT = $value['AMOUNT'];
    $REMARK = $value['REMARK'];
    $unique = $value['unique'];
    $sql->execute();
  }
}
else
{
  echo "No new records to add!";
}

现在它不再只是为了检查和比较基于“唯一”列的最大行值而选择所有内容。 运行速度比以前快得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM