Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Importuj duży plik CSV do MySQL

spróbuj najpierw zoptymalizować swoje skrypty. Po pierwsze, nigdy nie uruchamiaj pojedynczych zapytań podczas importowania, chyba że nie masz innego wyjścia, obciążenie sieci może być zabójcze.

Wypróbuj coś takiego (oczywiście nieprzetestowane i zakodowane w polu tekstowym SO, sprawdź, czy nawiasy pasują e.c.t.):

$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);
}

Pobaw się liczbą w array_chunk, zbyt duża i może powodować problemy, takie jak zbyt długie zapytanie (tak, w my.cnf jest konfigurowalny limit), zbyt małe i niepotrzebne obciążenie.

Możesz także zrezygnować z przypisywania zmiennej $data[x] do zmiennych, ponieważ jest to marnotrawstwo, biorąc pod uwagę, jak mały jest skrypt, po prostu użyj $data[x] bezpośrednio w zapytaniu, np. (nie przyniesie znacznej poprawy, ale w zależności od rozmiaru importu może trochę zaoszczędzić).

Następną rzeczą byłoby użycie wstawek/aktualizacji o niskim priorytecie, sprawdź to, aby uzyskać więcej informacji na ten temat, aby zacząć:Jak nadać priorytet niektórym zapytaniom?

po tym wszystkim możesz pomyśleć o optymalizacji konfiguracji mysql, ale to jest to, co Google wyjaśnia naprawdę, ponieważ najlepsze ustawienia są różne dla wszystkich i ich wyjątkowych sytuacji

Edytuj: Inną rzeczą, którą zrobiłem wcześniej, jest to, że jeśli masz skonfigurowanych wiele kluczy, które nie są wymagane do importu, możesz tymczasowo je porzucić i dodać je z powrotem po zakończeniu skryptu. Może to również zapewnić dobrą poprawę czasu, ale podczas pracy nad bazą danych na żywo istnieją pułapki, które należy obejść, jeśli pójdziesz tą drogą.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać klucz podstawowy autoinkrementacji MySQL z Sequelize na save()?

  2. Sphinx Search / MySQL znajduje najpopularniejsze słowa

  3. Dlaczego wykonanie zapytania wstawiającego czasami trwa tak długo?

  4. Dlaczego warto korzystać z opcji WYBIERZ DO AKTUALIZACJI?

  5. Python pymySQL wysyłający ciąg znaków z cudzysłowami