Page 1 sur 2

mysql qui bloque

Posté : 12 juil. 2009, 12:37
par kanaille
Bonjour,

Je travaille avec du php/mysql sous linux. Les variables de conf du serveur mysql sont celles par défaut.

Je traite un nombre conséquent de données entre php et sql (plusieurs dizaines de Mo en longtext), ce qui ralentit considérablement le serveur sql, jusqu'à le bloquer plusieurs heures pour traiter certaines requêtes.

Me conseillez vous :
-de rien faire car il n'y a rien à faire et de m'acheter une cafetière en attendant.
-de lancer plusieurs serveurs mysql afin de scinder la charge de travail
-d'optimiser les variables du serveur (et comment ?).

Merci pour tout conseil qui sera franchement le bienvenue.

Posté : 12 juil. 2009, 13:37
par Sékiltoyai
Voir si tu ne peux pas revoir tes traitements ?

Posté : 12 juil. 2009, 14:26
par kanaille
Voir si tu ne peux pas revoir tes traitements ?
Salut Sékiltoyai,

non malheureusement, c'est l'insert/select qui bloquent et je n'utilise pas sql pour faire des choses plus complexes du type 'regex' ou 'distinct'.

Posté : 12 juil. 2009, 15:31
par Sékiltoyai
Voir si tu ne peux pas revoir tes traitements ?
Salut Sékiltoyai,

non malheureusement, c'est l'insert/select qui bloquent et je n'utilise pas sql pour faire des choses plus complexes du type 'regex' ou 'distinct'.
Un select ça peut se faire mal hein :)
Certaines récupérations sont plus efficaces au niveau du serveur SQL, d'autres au niveau du langage.

Posté : 12 juil. 2009, 17:00
par kanaille
Voir si tu ne peux pas revoir tes traitements ?
Salut Sékiltoyai,

non malheureusement, c'est l'insert/select qui bloquent et je n'utilise pas sql pour faire des choses plus complexes du type 'regex' ou 'distinct'.
Un select ça peut se faire mal hein :)
Certaines récupérations sont plus efficaces au niveau du serveur SQL, d'autres au niveau du langage.
Pour le select, je sélectionne que le strict nécessaire.

Bon, je vais suivre ton conseil et voir si je ne peux pas traiter une partie des requêtes par php à la place de mysql.

Merci de ton aide.

Posté : 12 juil. 2009, 18:22
par Sékiltoyai
Salut Sékiltoyai,

non malheureusement, c'est l'insert/select qui bloquent et je n'utilise pas sql pour faire des choses plus complexes du type 'regex' ou 'distinct'.
Un select ça peut se faire mal hein :)
Certaines récupérations sont plus efficaces au niveau du serveur SQL, d'autres au niveau du langage.
Pour le select, je sélectionne que le strict nécessaire.

Bon, je vais suivre ton conseil et voir si je ne peux pas traiter une partie des requêtes par php à la place de mysql.

Merci de ton aide.
Bah ca peut être le contraire aussi, ca dépend ce que tu fais.
Si tu traites des données pour les réinjecter dans une autre par exemple, il y a des chances que cela se fasse de manière beaucoup plus optimisées avec des procédures stokées. Idem si tu as des opérations qui demandent le parcours concourant de plusieurs tables.

Bref, ça dépend…
Le mieux, c'est que tu dises grosso modo les traitements que tu fais.

Posté : 12 juil. 2009, 19:21
par kanaille
Un select ça peut se faire mal hein :)
Certaines récupérations sont plus efficaces au niveau du serveur SQL, d'autres au niveau du langage.
Pour le select, je sélectionne que le strict nécessaire.

Bon, je vais suivre ton conseil et voir si je ne peux pas traiter une partie des requêtes par php à la place de mysql.

Merci de ton aide.
Bah ca peut être le contraire aussi, ca dépend ce que tu fais.
Si tu traites des données pour les réinjecter dans une autre par exemple, il y a des chances que cela se fasse de manière beaucoup plus optimisées avec des procédures stokées. Idem si tu as des opérations qui demandent le parcours concourant de plusieurs tables.

Bref, ça dépend…
Le mieux, c'est que tu dises grosso modo les traitements que tu fais.
"Procédures stockées" ? C'est quoi ?

Alors ce que je fais, c'est pas bien compliqué :

1° J'ai des données
2° Je stocke les données dans une table sql (c'est surtout là que ça bloque car après il reste moins de données)
3° Je récupère ces données et les traite avec php
4° je réinsère les données traitées dans une autre table

Posté : 12 juil. 2009, 19:40
par Sékiltoyai
"Procédures stockées" ? C'est quoi ?
http://www.lmgtfy.com/?q=procedures%20stockees%20mysql
Alors ce que je fais, c'est pas bien compliqué :

1° J'ai des données
2° Je stocke les données dans une table sql (c'est surtout là que ça bloque car après il reste moins de données)
3° Je récupère ces données et les traite avec php
4° je réinsère les données traitées dans une autre table
Euh, c'est moyen précis ça…
En gros tu prends des trucs, tu fais des choses dessus, et ça donne des machins ? :)

Posté : 12 juil. 2009, 19:57
par kanaille
"Procédures stockées" ? C'est quoi ?
http://www.lmgtfy.com/?q=procedures%20stockees%20mysql
Alors ce que je fais, c'est pas bien compliqué :

1° J'ai des données
2° Je stocke les données dans une table sql (c'est surtout là que ça bloque car après il reste moins de données)
3° Je récupère ces données et les traite avec php
4° je réinsère les données traitées dans une autre table
Euh, c'est moyen précis ça…
En gros tu prends des trucs, tu fais des choses dessus, et ça donne des machins ? :)
Merci pour le lien, je vais regarder ça tout de suite.

voici les codes :

--ETAPE D'INSERTION DE L'ENSEMBLE DES DONNEES (C'est là que ça ralentit à fond la caisse car il y en a beaucoup)

$sql="INSERT INTO back (identifiant, compta, solde) values ('$id', '$cc', '$resultat')";
mysql_query($sql);


--ETAPE DE RECUPERATION DES DONNEES (afin de traiter les données avec php, ici tout va bien)

$sql="SELECT * from back where (identifiant='$id' and where solde!='0')";
mysql_query($sql);

(etc.)

Voila. J'espère que c'est plus clair comme ça.

Posté : 12 juil. 2009, 20:49
par Sékiltoyai
Tu fais une requête d'insertion par enregistrement ?

Posté : 12 juil. 2009, 21:05
par kanaille
Tu fais une requête d'insertion par enregistrement ?
Heu... j'ai beau regarder sur notre ami google, je ne pense pas saisir exactement l'expression "insertion par enregistrement". Je suis confus, mais en fait, je n'ai pas de connaissance académique en la matière.

Disons que j'enregistre dans une table mysql une série de données à l'aide de la commande insert.

exemple :

valeurs récupérées grace à un traitement initial de php :

id : 4 compta : 512 solde : 1200
id : 4 compta : 404 solde : 1000
id : 4 compta : 4457 solde : 200

Pour chaque ligne, je fais :

$sql="INSERT INTO back (identifiant, compta, solde) values ('$id', '$cc', '$resultat')";
mysql_query($sql);

Posté : 12 juil. 2009, 21:11
par mojorisin
Rien de plus que regexp et distinct? sur des champs longtext, normale que cela pose soucis je pense.

Oriente toi vers de la recherche full text plutot que du regexp.
Quant au distinct sur du longtext, ça me parait vraiment bizarre.

Je penserai sur une optimisation des champs mais sans en savoir plus sur les données à stocker(j'ai survolé le post) je ne pourrais en dire plus.

Je relierai le sujet en revenant dans 3 jours :)

Posté : 12 juil. 2009, 21:18
par kanaille
Rien de plus que regexp et distinct? sur des champs longtext, normale que cela pose soucis je pense.

Oriente toi vers de la recherche full text plutot que du regexp.
Quant au distinct sur du longtext, ça me parait vraiment bizarre.

Je penserai sur une optimisation des champs mais sans en savoir plus sur les données à stocker(j'ai survolé le post) je ne pourrais en dire plus.

Je relierai le sujet en revenant dans 3 jours :)
:-)

J'ai même pas de regex ni de distinct avec mysql : j'ai déjà délégué ça à php car côté sql, ça prenait vraiment trop trop trop trop de temps.

Les données à stocker sont des chiffres et des lettres, rien de binaires ou de choses exotiques.

C'est la masse d'info qui est trop importante. php est trop rapide pour mon mysql.

Posté : 12 juil. 2009, 21:51
par Sékiltoyai
Tu fais une requête d'insertion par enregistrement ?
Heu... j'ai beau regarder sur notre ami google, je ne pense pas saisir exactement l'expression "insertion par enregistrement". Je suis confus, mais en fait, je n'ai pas de connaissance académique en la matière.
Bah sur cette page notamment, ils donnent un exemple d'insertion multiple :

Code : Tout sélectionner

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
Tu peux gagner beaucoup de temps de (non) traitement.

Posté : 12 juil. 2009, 22:27
par kanaille

Code : Tout sélectionner

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
Tu peux gagner beaucoup de temps de (non) traitement.
Super, merci !!!

Il me reste à déterminer le nb de valeurs (1,2,3)(...) que je ne connais pas initialement et c'est bon. Avec php, j'aurai pas trop de mal à le coder je pense.

Merci !!