Mysql
 sql >> Base de données >  >> RDS >> Mysql

comment gérer une grande taille de requête de mise à jour dans mysql avec laravel

Si vous envisagez de créer une requête telle que UPDATE users SET column = 'value' WHERE id = 1 OR id = 2 OR id = 3 ... OR id = 50000 ou WHERE id IN (1, 2, 3, ..., 50000) alors ce sera probablement trop grand. Si vous pouvez faire une logique pour résumer cela, cela raccourcirait la requête et accélérerait considérablement les choses du côté de MySQL. Peut-être pourriez-vous en faire WHERE id >= 1 AND id <= 50000 .

Si ce n'est pas une option, vous pouvez le faire en rafales. Vous allez probablement parcourir les lignes du fichier CSV, construire la requête comme un gros WHERE id = 1 OR id = 2... requête et toutes les 100 lignes environ (ou 50 si c'est encore trop gros), exécutez la requête et démarrez-en une nouvelle pour les 50 identifiants suivants.

Ou vous pouvez simplement exécuter 50 000 UPDATE uniques requêtes sur votre base de données. Honnêtement, si la table utilise correctement les index, l'exécution de 50 000 requêtes ne devrait prendre que quelques secondes sur la plupart des serveurs Web modernes. Même les serveurs les plus occupés devraient pouvoir gérer cela en moins d'une minute.

Quant à la lecture d'un fichier en morceaux, vous pouvez utiliser les fonctions d'accès aux fichiers de base de PHP pour cela :

$file = fopen('/path/to/file.csv', 'r');

// read one line at a time from the file (fgets reads up to the
// next newline character if you don't provide a number of bytes)
while (!feof($file)) {
    $line = fgets($file);

    // or, since it's a CSV file:
    $row = fgetcsv($file);
    // $row is not an array with all the CSV columns

    // do stuff with the line/row
}

// set the file pointer to 60 kb into the file
fseek($file, 60*1024);

// close the file
fclose($file);

Cela ne lira pas le fichier complet en mémoire. Je ne sais pas si Laravel a sa propre façon de gérer les fichiers, mais voici comment le faire en PHP de base.