OVH Cloud OVH Cloud

[MySQL]

9 réponses
Avatar
Pif
C'est peut etre pas le forum le plus adapté, mais voici mon problème :

Je fais une grande série de requetes SELECT puis INSERT (la premiere
servant à vérifier que l'enregistrement n'existe pas déjà) ...

Pour le coup, mon mysqld se met à gonfler indéfiniement en mémoire et
pete un plomb...

J'aimerais savoir s'il y a un moyen de faire en sorte qu'il exécute les
requete genre 1000 par 1000 et pas de façon abusive (plus de 800 Mo de
RAM) ... il y a le HIGH PRIORITY, mais y'a pas un moyen plus soft et
certainement performant ?

Merci !

9 réponses

Avatar
ludo06
Pif wrote:
C'est peut etre pas le forum le plus adapté, mais voici mon problème :

Je fais une grande série de requetes SELECT puis INSERT (la premiere
servant à vérifier que l'enregistrement n'existe pas déjà) ...

Pour le coup, mon mysqld se met à gonfler indéfiniement en mémoire et
pete un plomb...

J'aimerais savoir s'il y a un moyen de faire en sorte qu'il exécute les
requete genre 1000 par 1000 et pas de façon abusive (plus de 800 Mo de
RAM) ... il y a le HIGH PRIORITY, mais y'a pas un moyen plus soft et
certainement performant ?

Merci !
Je ne sais pas si c'est applicable a ton environnement mais tu ne peux

pas bloquer la ou les tables pendant que tu fais ta selection/insertion
et passer tes requetes en plusieurs fois (1000 par 1000 par exemple) ?

--
Cordialement,
---
Ludo
----
http://www.ubik-products.com

Avatar
Pif
le problème c'est que mon programme java est trop rapide, tu coup, je
pense que JDBC et MySQL essayent tous deux de mettre dans une file les
requetes et de s'exécuter... au lieu de bloquer le processus appelant... .

ce que j'aimerais, c'est que la BD limite la rapidité de l'appelant ...
chacun gere un cache que j'aimerais limiter...

mais c'est bizare, car meme avec un high priority ca ne marche pas ...
pourtant logiquement, mes select on besoin du résultat avant que la
suite ne s'exécute... par conséquent, il gere carrément une vue de ma
table en mémoire ou alors j'ai rien compris, j'ai pourtant vérifié X
fois que j'avais pas un ResultSet ou un Statement qui n'était pas fermé !?



Pif wrote:

C'est peut etre pas le forum le plus adapté, mais voici mon problème :

Je fais une grande série de requetes SELECT puis INSERT (la premiere
servant à vérifier que l'enregistrement n'existe pas déjà) ...

Pour le coup, mon mysqld se met à gonfler indéfiniement en mémoire et
pete un plomb...

J'aimerais savoir s'il y a un moyen de faire en sorte qu'il exécute
les requete genre 1000 par 1000 et pas de façon abusive (plus de 800
Mo de RAM) ... il y a le HIGH PRIORITY, mais y'a pas un moyen plus
soft et certainement performant ?

Merci !


Je ne sais pas si c'est applicable a ton environnement mais tu ne peux
pas bloquer la ou les tables pendant que tu fais ta selection/insertion
et passer tes requetes en plusieurs fois (1000 par 1000 par exemple) ?




Avatar
SL
Pif wrote:
C'est peut etre pas le forum le plus adapté, mais voici mon problème :

Je fais une grande série de requetes SELECT puis INSERT (la premiere
servant à vérifier que l'enregistrement n'existe pas déjà) ...

normalement c'est le job du SGBD ca,

si tu veux avoir des enregistrements uniques il FAUT les declarer comme
tels au niveau de MySQL (unique, primary key...)


J'aimerais savoir s'il y a un moyen de faire en sorte qu'il exécute les
requete genre 1000 par 1000 et pas de façon abusive (plus de 800 Mo de
RAM) ... il y a le HIGH PRIORITY, mais y'a pas un moyen plus soft et
certainement performant ?

Merci !


jette un oeuil sur les preparedStatement, ca pourrait t'interesser...

en esperant faire avancer le schimiliblik,
tchao,

--
SL

Avatar
Christophe Tela
mais c'est bizare, car meme avec un high priority ca ne marche pas ...
pourtant logiquement, mes select on besoin du résultat avant que la
suite ne s'exécute... par conséquent, il gere carrément une vue de ma
table en mémoire ou alors j'ai rien compris, j'ai pourtant vérifié X
fois que j'avais pas un ResultSet ou un Statement qui n'était pas fermé !?


Tu serais pas dans une transaction par hasard ? Je ne connais pas MySQL,
mais dans la plupart des bases de données, il faut faire un commit() de
temps en temps pour "purger" la transaction, lorque tu fais des grosses
insertions de données.

Avatar
Pif
j'ai en transaction autocommit()
ca posait en effet problème...

depuis que j'ai enlevé cette option et que je fais moi meme les commits,
c'est un peu mieux, mais ca explosre quand meme ( plus tard ... )

des idées pour controler le cache de MySQL ?

merci !

Christophe Tela wrote:
mais c'est bizare, car meme avec un high priority ca ne marche pas ...
pourtant logiquement, mes select on besoin du résultat avant que la
suite ne s'exécute... par conséquent, il gere carrément une vue de ma
table en mémoire ou alors j'ai rien compris, j'ai pourtant vérifié X
fois que j'avais pas un ResultSet ou un Statement qui n'était pas fermé !?



Tu serais pas dans une transaction par hasard ? Je ne connais pas MySQL,
mais dans la plupart des bases de données, il faut faire un commit() de
temps en temps pour "purger" la transaction, lorque tu fais des grosses
insertions de données.



Avatar
Pif
normalement c'est le job du SGBD ca,
si tu veux avoir des enregistrements uniques il FAUT les declarer comme
tels au niveau de MySQL (unique, primary key...)



je veux compter la fréquence d'un mot, ou plus généralement d'une chaine
de caractères dans un texte, du coup, par la suite un identifiant
numérique est bien plus intéressant à mémoriser... mais du coup je suis
obliger de jouer sur des select pour récupérer l'identifiant associé à
un mot... je chargerais bien tout en mémoire, mais j'ai plusieurs
millions de termes dans la base...

la rapidité de cette instruction est une question, mais ca n'empeche que
le problème reste le meme, et ne ferait qu'empirer en rajoutant des
contraintes d'intégrité : une longue série de INSERT provoque un cache
qui est trop important, je veux pouvoir limiter ce cache et bloquer le
processus appelant..


jette un oeuil sur les preparedStatement, ca pourrait t'interesser...



déjà fait !
merci !

en esperant faire avancer le schimiliblik,
tchao,



Avatar
Sebastien Mathy
Pif wrote:

j'ai en transaction autocommit()
ca posait en effet problème...

depuis que j'ai enlevé cette option et que je fais moi meme les commits,
c'est un peu mieux, mais ca explosre quand meme ( plus tard ... )

des idées pour controler le cache de MySQL ?



Il faut aller voir dans le fichier my.cnf

Avatar
Pif
ou ca ?

sur la doc de mysql sur leur propre site ils sont avares en détails à ce
sujet !
Avatar
Christophe Tela
sur la doc de mysql sur leur propre site ils sont avares en détails à ce
sujet !
C'est vrai. Par contre, tu peux regarder dans ton installation, tu dois

avoir un fichier nommé my-huge.cnf qui à travers ses commentaires et ses
exemples doit pouvoir te permettre de tenter des solutions.