2014-03-01 3 views
0

각 사용자가 각 데이터베이스에 동일한 스키마가있는 고유 한 데이터베이스를 가져 오는 응용 프로그램이 있습니다. 여러 데이터베이스 마이그레이션 성능 향상

  • 이가 시간이 오래 걸릴 수 있습니다 SQL 문
  • 을 실행하여 데이터베이스를 통해

    1. SHOW 데이터베이스
    2. 으로 반복을 :

      나는 이런 식으로 마이그레이션을 수행하는 스크립트를 많은 시간이 소요되는 복잡한 쿼리 (3 초 이상)

      거기에 한 스크립트에서 동시에 각 데이터베이스에 대해 SQL 문을 실행할 수있는 방법이 있습니까? 이 작업을 수행하는 데 위험하거나 너무 리소스가 많이 소모됩니까?

      내가 원하는 이유는 가능한 한 중단 시간을 방지하기 위해서입니다. 데이터베이스가 부하 보유 할 경우

      <?php 
      ini_set('display_errors', 1); 
      set_time_limit(0); 
      $sql = file_get_contents('../update.sql'); 
      $sql_queries = explode(";", $sql); 
      $exclude_dbs = array('horde','phppoint_forums','phppoint_site','roundcube', 'pos', 'bntennis_site', 'mysql', 'information_schema', 'performance_schema'); 
      
      $conn = mysqli_connect("localhost", "root", "PASSWORD"); 
      $show_db_query = mysqli_query($conn, 'SHOW databases'); 
      $databases = array(); 
      while ($row = mysqli_fetch_assoc($show_db_query)) 
      { 
          if (!in_array($row['Database'], $exclude_dbs)) 
          { 
           $databases[] = $row['Database']; 
          } 
      } 
      
      foreach($databases as $database) 
      { 
          mysqli_select_db($conn, $database); 
          echo "Running queries on $database\n***********************************\n"; 
          foreach($sql_queries as $query) 
          { 
           if (!empty($query)) 
           { 
            echo "$query;"; 
            if (!mysqli_query($conn, $query)) 
            { 
             echo "\n\nERROR: ".mysqli_error($conn)."\n\n"; 
            } 
           } 
          } 
          echo "\n\n"; 
      } 
      ?> 
      
    +0

    한 번의 작업으로 각 데이터베이스에 대한 쿼리를 실행하는 것은 매우 위험하며 리소스 호그가됩니다. 쿼리 나 동작을 분리 한 다음 각각을 호출하는 것이 좋습니다. 또는 주 데이터를 하나의 데이터베이스에 복사 한 다음 쿼리를 실행하여 더 많은 정보가 필요할 때 데이터베이스를 쿼리하는 방법을 호출 할 수도 있습니다. 그러나 한 번에 여러 데이터베이스에 복잡한 쿼리를 보내면 보안 및 응답 시간을 볼 때 결코 좋은 생각이 아닙니다. – James

    답변

    0

    내가 모르지만, 기본적으로 내가 언어에 따라 프로세스를 포크 또는 배경으로 산란 것 :

    여기 지금 내 스크립트입니다.

    PHP의 경우 기본적으로 병렬로 마이그레이션을 실행하는 각 데이터베이스에 대해 프로세스를 포크 할 수 있습니다.

    +0

    예 200 데이터베이스에서 비싼 쿼리를 동시에 실행하는 것이 나쁜 생각 일 수 있다고 생각하기 시작했습니다. –