Optimiser la mise à jour de la Base de données MySQL

Répondre
nguim
le 26/02/2014 à 08:58
nguim
Bonsoir à tous !

Je suis nouveau dans le Forum.

Je suis débutant en PHP, et j'ai écrit un petit code pour pouvoir mettre à jour les données de ma BDD.
En fait ces informations sont contenues dans un fichier texte (de nom fichab.txt), la première colonne du fichier texte correspond à l'IMSI et la seconde colonne correspond à MEID. Et le but est de:

Pour chaque IMSI du fichier texte (même IMSI qui se trouve dans la BDD) remplacer son MED de la BDD par celui qui est contenu dans le ficher texte. Bref l'IMSI et MEID se trouvent dans une même table de la BDD et c'est la colonne MEID que l'on veut modifier.

Voici la structure de mon fichier texte.

(------IMSI---------------MEID)
624030743830000 1100001D7DEE6D
624030743830001 CC00001D7DEE6E
624030743830002 3100001D7DEE6F
624030743830003 4100001D7DEE70
624030743830004 CC00001D7DEE71


Voici mon script:


<?php 
<?php
set_time_limit(0);
error_reporting(E_ALL ^ E_NOTICE);
mysql_connect('localhost','root','');
mysql_select_db('gestnum');
/On ouvre le fichier en question (en lecture seule)
$handle = fopen("fichab.txt", "r");
//on parcours tout le fichier (en faisant croire qu'il s'agit d'un csv pour faciliter le traitement)
//$i = 0;
while (($data = fgetcsv($handle, 0, " ")) !== FALSE) {
$queryBase = 'UPDATE coordab SET MEID="'.$data[1].'", WHERE IMSI="'.$data[0].'"';
mysql_query($queryBase);
}
//on ferme le fichier
fclose($handle);
?> php ?>


Lorsque je l'exécute, il fait la mise à jour mais en prenant beaucoup de temps (plus de 20 minutes) le fichier contient 9999 lignes.

Je voudrais que vous m'aidiez à optimiser mon code pour pouvoir réduire le temps d'exécution de ce script.

Voici la structure de ma table coordab:
<?php -- phpMyAdmin SQL Dump
-- version 4.0.4
-- http://www.phpmyadmin.net
--
-- Client: localhost
-- Généré le: Mer 26 Février 2014 à 07:33
-- Version du serveur: 5.6.12-log
-- Version de PHP: 5.4.12

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données: `gestnum`
--
CREATE DATABASE IF NOT EXISTS `gestnum` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `gestnum`;

-- --------------------------------------------------------

--
-- Structure de la table `coordab`
--

CREATE TABLE IF NOT EXISTS `coordab` (
`ida` int(60) NOT NULL AUTO_INCREMENT,
`IMSI` varchar(255) NOT NULL,
`MEID` varchar(255) NOT NULL,
`ESN1` varchar(255) NOT NULL,
`PUK1` varchar(255) NOT NULL,
`AKY` varchar(255) NOT NULL,
`MDN` varchar(255) NOT NULL,
PRIMARY KEY (`ida`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

--
-- Contenu de la table `coordab`
--

INSERT INTO `coordab` (`ida`, `IMSI`, `MEID`, `ESN1`, `PUK1`, `AKY`, `MDN`) VALUES
(1, '624030743830000', 'A100001D7DEE6D', '80E5FA73', '37312379', '0E47EA7A6F444640', '33830000'),
(2, '624030743830001', 'A100001D7DEE6E', '80AE089F', '91944192', 'F9052B04E3969977', '33830001'),
(3, '624030743830002', 'A100001D7DEE6F', '809A1A9F', '29861661', '4617481A74D864B5', '33830002'),
(4, '624030743830003', 'A100001D7DEE70', '80E68950', '20303707', '1C45F0418B552C45', '33830003'),
(5, '624030743830004', 'A100001D7DEE71', '80C275C6', '70591541', 'EA26D0523114FFF2', '33830004');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
php ?>


Aidez moi s'il vous plait.

Merci d'avance.
LupusMic
le 26/02/2014 à 12:59
LupusMic
Tout d'abord, je tiens à préciser que ton fichier est un CSV.

Ensuite, pour optimiser, il faut mesurer pour savoir ce qui est lent. Pour ça, tu as la fonction posix_times qui te permettra de mesurer l'usage fait par une portion de code.

<?php
$pt = posix_times();
$begin= $pt['utime'] + $pt['stime'];

// do something

$pt = posix_times();
$end = $pt['utime'] + $pt['stime'];

printf("%d\n", $end - $begin);


Voilà pour l'idée principale. ne sous-estime pas la lecture du fichier. Essaye de vérifier quel élément prend réellement du temps.

Si ce sont effectivement les opérations sur MySQL qui sont lentes, peut-être qu'il a un problème concernant le réseau. Mais dans ton cas, je pense qu'il y a deux voies d'optimisation :
- désactiver l'autocommit
- utiliser une prepared statement

Fais déjà le benchmarking, puis modifie le code en désactivant l'autocommit.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LupusMic
le 26/02/2014 à 13:40
LupusMic
Et évidement, il faut que le code initial soit correct, il y a une erreur dans ta requête SQL (une virgule qui se promène).
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours