Mysql
 sql >> база данни >  >> RDS >> Mysql

Импортирайте голям CSV файл в MySQL

опитайте първо да оптимизирате вашите скриптове. Първо, никога не изпълнявайте единични заявки при импортиране, освен ако нямате друг избор, режийните разходи в мрежата могат да бъдат убиец.

Опитайте нещо от рода на (очевидно нетествано и кодирано в текстовото поле SO, проверете скобите съвпадат и др.):

$url = 'http://www.example.com/directory/file.csv';
if (($handle = fopen($url, "r")) !== FALSE) 
{
fgetcsv($handle, 1000, ",");

$imports = array();

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
{
    $EvID = $data[0];
    $Ev = $data[1];
    $PerID = $data[2];
    $Per = $data[3];
    $VName = $data[4];
    $VID = $data[5];
    $VSA = $data[6];
    $DateTime = $data[7];
    $PCatID = $data[8];
    $PCat = $data[9];
    $CCatID = $data[10];
    $CCat = $data[11];
    $GCatID = $data[12];
    $GCat = $data[13];
    $City = $data[14];
    $State = $data[15];
    $StateID = $data[16];
    $Country = $data[17];
    $CountryID = $data[18];
    $Zip = $data[19];
    $TYN = $data[20];
    $IMAGEURL = $data[21];
    $URLLink = $data[22];

        $data[7] = strtotime($data[7]);
        $data[7] = date("Y-m-d H:i:s",$data[7]);

    if((($PCatID == '2') && (($CountryID == '217') or ($CountryID == '38'))) || (($GCatID == '16') or ($GCatID == '19') or ($GCatID == '30') or ($GCatID == '32'))) 
    {

    $imports[] = "('".md5($EventID.$PerformerID)."','".addslashes($data[0])."','".addslashes($data[1])."','".addslashes($data[2])."','".addslashes($data[3])."','".addslashes($data[4])."',
                    '".addslashes($data[5])."','".addslashes($data[6])."','".addslashes($data[7])."','".addslashes($data[8])."','".addslashes($data[9])."',
                '".addslashes($data[10])."','".addslashes($data[11])."','".addslashes($data[12])."','".addslashes($data[13])."','".addslashes($data[14])."',
                    '".addslashes($data[15])."','".addslashes($data[16])."','".addslashes($data[17])."','".addslashes($data[18])."','".addslashes($data[19])."',
                '".addslashes($data[20])."','".addslashes($data[21])."')";



    }
}

$importarrays = array_chunk($imports, 100);
foreach($importarrays as $arr) {

 if(!mysql_query("INSERT IGNORE INTO TNDB_CSV2 
                (id, EvID, Event, PerID, Per, VName,
                     VID, VSA, DateTime, PCatID, PCat,                
                CCatID, CCat, GCatID, GCat, City,
                     State, StateID, Country, CountryID, Zip,
                TYN, IMAGEURL) VALUES ".implode(',', $arr)){

     die("error: ".mysql_error());

 }

 }

fclose($handle);
}

Поиграйте си с числото в array_chunk, твърде голямо и може да причини проблеми като твърде дълга заявка (да, има конфигурируемо ограничение в my.cnf), твърде малка и ненужни излишни разходи.

Можете също да откажете използването на присвояване на $data[x] на променливи, тъй като това е загуба, като се има предвид колко малък е скриптът, просто използвайте $data[x] директно във вашата заявка и т.н. (няма да доведе до значително подобрение, но в зависимост от размера на вашия импорт може да спести малко).

Следващото нещо би било да използвате вмъквания/актуализации с нисък приоритет, вижте това за повече информация за това, за да започнете:Как да дам приоритет на определени заявки?

след всичко това бихте могли да се сетите за оптимизация на конфигурацията на mysql, но това е нещо, което Google трябва да обясни наистина, тъй като най-добрите настройки са различни за всеки и неговите уникални ситуации

Редактиране: Друго нещо, което съм правил преди, е, че ако имате настроени много ключове, които не са необходими за импортирането, можете да пуснете тези ключове временно и да ги добавите обратно, когато скриптът приключи. Това също може да доведе до добри подобрения във времето, но тъй като работите върху база данни на живо, има клопки, които да заобиколите, ако тръгнете по този път.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не е уникална таблица/псевдоним

  2. Не може да се открие нулева стойност от JSON_EXTRACT

  3. ANDROID&PHP - Как да покажа JSONArray от MySql с помощта на PHP

  4. JS не може да потърси MySQL база данни. ГРЕШКА:connection.query не е функция

  5. Как да проверя дали резултатите от MySQL са се върнали празни в PHP?