OVH Cloud OVH Cloud

WD8/MySQL

10 réponses
Avatar
I.G.LOG
Bonjour,
J'utilise WD8 315j et MySQL 4.0.20c.
L'affichage des tables fichier est extremement lent sur MySQL -notamment sur
les tables importantes- alors qu'avec HF c'est instantané. A titre
d'exemple, sur une table de 5000 enregistrement, comportant des liens sur
d'autre fichiers dans le code "affichage d'une ligne", l'affichage de la
1ere page met 20 secondes avec MySQL contre 0,5 secondes avec HF (pour le
meme code). ensuite, le parcours de la table est beaucoup moins "veloce"
avec MySQL (avec PgDn, temps d'attente de qq secondes toutes les 3 pages
alors qu'il n'y a pas ce ralentissement avec HF).
Connaissez vous un moyen de regler ce probleme (je suis en local et j'ai
peur des resultats en exploitation reseau !)
Merci a tous

10 réponses

Avatar
Manu
I.G.LOG wrote:
Bonjour,
J'utilise WD8 315j et MySQL 4.0.20c.



Première question : tu utilises quel accès pour accéder à MySQL ?

L'affichage des tables fichier est extremement lent sur MySQL
-notamment sur les tables importantes- alors qu'avec HF c'est
instantané. A titre d'exemple, sur une table de 5000 enregistrement,
comportant des liens sur d'autre fichiers dans le code "affichage
d'une ligne", l'affichage de la 1ere page met 20 secondes avec MySQL
contre 0,5 secondes avec HF (pour le meme code). ensuite, le parcours
de la table est beaucoup moins "veloce" avec MySQL (avec PgDn, temps
d'attente de qq secondes toutes les 3 pages alors qu'il n'y a pas ce
ralentissement avec HF).



Connaissez vous un moyen de regler ce probleme (je suis en local et
j'ai peur des resultats en exploitation reseau !)



L'utilisation des select ... Limit ...
Avatar
I.G.LOG
Bonjour,

Première question : tu utilises quel accès pour accéder à MySQL ?




Dans ce cas, j'utilise l'acces natif PcSoft (le dernier mis en
telechargement)


L'utilisation des select ... Limit ...




J'ai fait cet essai avec "select... limit" mais ce n'est applicable que sur
les tables de taille "raisonnables": sur les tables importantes, les
performances s'ecroulent sur les derniers enregistrements car le limit est
recalcule a chaque fois (apres un quinzaine de PgDn, il faut plusieurs
secondes pour que les pages soient affichees). De plus, j'ai besoin de
pouvoir trier la table en fonction de plusieurs criteres. un exemple: table
des articles, l'utilisateur peut effectuer des recherches/parcours par N°
d'article, Référence et Désignation (a noter d'ailleurs, l'affichage est +
rapide qd on tri par le n° d'article -numerique- et beaucoup moins par ref
et designation -alpha). Je me suis "cassé la tete" pour developper un
browser dynamique, base sur le select limit, permettant les tris sur
plusieurs cles, mais, sans le concept de n° physique d'enregistrement, je ne
pense pas qu'il y ait une solution (avec le pointeur sur le fichier data, il
suffit de changer d'index en conservant ce pointeur et le tour est joué; je
pense que HF fonctionne comme ca. Mais en SQL, pas possible !?!)
Merci
Avatar
Manu
I.G.LOG wrote:
Bonjour,

Première question : tu utilises quel accès pour accéder à MySQL ?




Dans ce cas, j'utilise l'acces natif PcSoft (le dernier mis en
telechargement)


L'utilisation des select ... Limit ...




J'ai fait cet essai avec "select... limit" mais ce n'est applicable
que sur les tables de taille "raisonnables": sur les tables
importantes, les performances s'ecroulent sur les derniers
enregistrements car le limit est recalcule a chaque fois (apres un
quinzaine de PgDn, il faut plusieurs secondes pour que les pages
soient affichees). De plus, j'ai besoin de pouvoir trier la table en



Ce n'est pas normal, c'est qu'il te manque un index sur cette colonne, que
ta table est un peu comme du gruyère ou son index. Que donnent les résultats
après un optimize table ?

fonction de plusieurs criteres. un exemple: table des articles,
l'utilisateur peut effectuer des recherches/parcours par N°
d'article, Référence et Désignation (a noter d'ailleurs, l'affichage
est + rapide qd on tri par le n° d'article -numerique- et beaucoup
moins par ref et designation -alpha). Je me suis "cassé la tete" pour



Que donne l'explain plan de ta requete sous MySQL ? La taille mémoire
allouée aux tris MySQL est de combien ?

developper un browser dynamique, base sur le select limit, permettant
les tris sur plusieurs cles, mais, sans le concept de n° physique
d'enregistrement, je ne pense pas qu'il y ait une solution (avec le
pointeur sur le fichier data, il suffit de changer d'index en
conservant ce pointeur et le tour est joué; je pense que HF
fonctionne comme ca. Mais en SQL, pas possible !?!)
Merci


Avatar
I.G.LOG
> Ce n'est pas normal, c'est qu'il te manque un index sur cette colonne, que
ta table est un peu comme du gruyère ou son index. Que donnent les


résultats
après un optimize table ?



Pas de changement majeur (toutes les colonnes de tris sont bien des cles !)

Que donne l'explain plan de ta requete sous MySQL ? La taille mémoire
allouée aux tris MySQL est de combien ?



Euh... je n'en suis pas encore la sous MySQL :-( Par contre, j'ai utilisé la
fonction HOptimise de WD8: pas d'ammelioration notable non plus).
Je pense vraiment que le LIMIT est recalcule a chaque fois; sur une requete
qui retourne 80.000 tuples (c'est le cas dans mon exemple de table articles)
le LIMIT 15001,12 (par ex) doit bien effectuer la requete integralement,
PUIS compter les 15000 premiers tuples pour pouvoir se positionner sur le n°
15001 (se qui expliquerait la baisse de perf sur les derniers tuples) ?!
Avatar
Roumegou Eric
I.G.LOG a émis l'idée suivante :
Ce n'est pas normal, c'est qu'il te manque un index sur cette colonne, que
ta table est un peu comme du gruyère ou son index. Que donnent les résultats
après un optimize table ?



Pas de changement majeur (toutes les colonnes de tris sont bien des cles !)

Que donne l'explain plan de ta requete sous MySQL ? La taille mémoire
allouée aux tris MySQL est de combien ?



Euh... je n'en suis pas encore la sous MySQL :-( Par contre, j'ai utilisé la
fonction HOptimise de WD8: pas d'ammelioration notable non plus).
Je pense vraiment que le LIMIT est recalcule a chaque fois; sur une requete
qui retourne 80.000 tuples (c'est le cas dans mon exemple de table articles)
le LIMIT 15001,12 (par ex) doit bien effectuer la requete integralement,
PUIS compter les 15000 premiers tuples pour pouvoir se positionner sur le n°
15001 (se qui expliquerait la baisse de perf sur les derniers tuples) ?!



Pour en avoir le coeur net, je pense qu'il te faut capturer tes
requêtes dans le presse papier et les faire jouer depuis un frontal
mySQL (SQLyog, mysqlcc ...)
S'il y a un LIMIT, il n'y a aucune raison que la reqûete ne retourne
plus de tuples ???
(en natif tout au moins).

Commence donc à isoler ton problème.
Cela vient de ma base mySQL ?
Cela vient de l'accès ?

Avant d'utiliser mySQL avec WinDev il est à mon avis indispensable de
savoir l'attaquer hors WinDev et je ne saurais que trop vous conseiller
l'utilisation d'un frontal C/S. MySQL en ligne de commande, c'est d'un
autre age et phpmyadmin c'est limité. Avec un produit comme SQLyog,
tout est plus simple ensuite. (n'est ce pas Jacques ?)

--
Eric Roumégou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Manu
I.G.LOG wrote:
Ce n'est pas normal, c'est qu'il te manque un index sur cette
colonne, que ta table est un peu comme du gruyère ou son index. Que
donnent les résultats après un optimize table ?



Pas de changement majeur (toutes les colonnes de tris sont bien des
cles !)



OK

Que donne l'explain plan de ta requete sous MySQL ? La taille mémoire
allouée aux tris MySQL est de combien ?



Euh... je n'en suis pas encore la sous MySQL :-( Par contre, j'ai
utilisé la fonction HOptimise de WD8: pas d'ammelioration notable non
plus).



Tu lances la commande sous ton frontal préféré : optimize table ARTICLES;
si tu as la requete générée par Windev tu la récupères dans le presse papier
tu ajoutes EXPLAIN devant le select et tu nous renvoies le résultat de la
requete

Sinon des liens :
http://dev.mysql.com/doc/mysql/fr/Where_optimisations.html
http://www.nexen.net/docs/mysql/annotee/limit-optimisation.php

Concernant la taille allouée pour les tris c'est dans ton my.ini

Je pense vraiment que le LIMIT est recalcule a chaque fois; sur une
requete qui retourne 80.000 tuples (c'est le cas dans mon exemple de
table articles) le LIMIT 15001,12 (par ex) doit bien effectuer la
requete integralement, PUIS compter les 15000 premiers tuples pour
pouvoir se positionner sur le n° 15001 (se qui expliquerait la baisse
de perf sur les derniers tuples) ?!



Normalement non...
Avatar
Jacques TREPP
Roumegou Eric a couché sur son écran :
I.G.LOG a émis l'idée suivante :
Ce n'est pas normal, c'est qu'il te manque un index sur cette colonne, que
ta table est un peu comme du gruyère ou son index. Que donnent les
résultats
après un optimize table ?



Pas de changement majeur (toutes les colonnes de tris sont bien des cles !)

Que donne l'explain plan de ta requete sous MySQL ? La taille mémoire
allouée aux tris MySQL est de combien ?



Euh... je n'en suis pas encore la sous MySQL :-( Par contre, j'ai utilisé
la
fonction HOptimise de WD8: pas d'ammelioration notable non plus).
Je pense vraiment que le LIMIT est recalcule a chaque fois; sur une requete
qui retourne 80.000 tuples (c'est le cas dans mon exemple de table
articles)
le LIMIT 15001,12 (par ex) doit bien effectuer la requete integralement,
PUIS compter les 15000 premiers tuples pour pouvoir se positionner sur le

15001 (se qui expliquerait la baisse de perf sur les derniers tuples) ?!



Pour en avoir le coeur net, je pense qu'il te faut capturer tes requêtes dans
le presse papier et les faire jouer depuis un frontal mySQL (SQLyog, mysqlcc
...)
S'il y a un LIMIT, il n'y a aucune raison que la reqûete ne retourne plus de
tuples ???
(en natif tout au moins).

Commence donc à isoler ton problème.
Cela vient de ma base mySQL ?
Cela vient de l'accès ?

Avant d'utiliser mySQL avec WinDev il est à mon avis indispensable de savoir
l'attaquer hors WinDev et je ne saurais que trop vous conseiller
l'utilisation d'un frontal C/S. MySQL en ligne de commande, c'est d'un autre
age et phpmyadmin c'est limité. Avec un produit comme SQLyog, tout est plus
simple ensuite. (n'est ce pas Jacques ?)



je confirme :)
bien que je galère en ce moment (voir liste windev) avec une requète.
avec une base de 5185 records, j'ai des résultats de 4 700 000 lignes !
pour un vendredi, c'est pas mal, non ?

--
Jacques TREPP
AlbyGest

enlever _pasdespam pour me joindre
Avatar
I.G.LOG
Bonjour,

Suite à vos conseils, j'ai effectué la requete simple "select * from
articles where qte = 1 order by designation limit 15000,20" avec MySQL
Control Center 0.9.4-beta
Résultat : 20 rows en 0,11 sec. (vive MySQL !)
Ce test est effectué sur mon poste de dev en local, P4-2.6, RAM 1Go.

Jai fait mes premiers essais de LIMIT avec SQLManagerX (SQLTable) avec cette
requete, sans le where qte=1 (parcours de la table articles, sans filtre,
ordonné sur la clé designation) et j'avais bien des ralentissements au fur
et a mesure que j'avancais par PgDn vers le bas de la table (instantané sur
les premieres pages, mais vers les enreg 60.000, il fallait environ 10 sec
pour afficher la page). Ces essais ont été fait sur portable PII-233, 196Mo
de RAM, en local. Et, dans ce cas, je ne passe pas par l'acces natif de
PCSoft !

Donc, je ne comprends pas trop l'origine du probleme (vitesse proc, mémoire,
... ????)

Pour revenir sur mes essais en cours: j'utilise l'acces natif de PCsoft,
Table fichier pour parcourir la table ARTSERIE (20.000 enreg) suivant
l'index NUMSERIE (clé alpha). Dans le code "affichage d'une ligne" je fais
des recherches sur 7 autres fichiers par HLitRecherche(). Les trois
premieres pages mettent environ 8 à 10 sec a s'afficher, les suivantes 1 sec
(ce qui n'est pas tres "fluide" comme parcours). Ces resultat sont sur mon
poste de dev (P4-2.6,1Go RAM en local) et je pense que sur le reseau avec
des clients moins performants, ca ne va pas etre genial !

Merci encore pour tous vos conseils
Phil

"Manu" a écrit dans le message de
news:cie67f$qq8$
I.G.LOG wrote:
>> Ce n'est pas normal, c'est qu'il te manque un index sur cette
>> colonne, que ta table est un peu comme du gruyère ou son index. Que
>> donnent les résultats après un optimize table ?
>>
> Pas de changement majeur (toutes les colonnes de tris sont bien des
> cles !)

OK

>> Que donne l'explain plan de ta requete sous MySQL ? La taille mémoire
>> allouée aux tris MySQL est de combien ?
>>
> Euh... je n'en suis pas encore la sous MySQL :-( Par contre, j'ai
> utilisé la fonction HOptimise de WD8: pas d'ammelioration notable non
> plus).

Tu lances la commande sous ton frontal préféré : optimize table ARTICLES;
si tu as la requete générée par Windev tu la récupères dans le presse


papier
tu ajoutes EXPLAIN devant le select et tu nous renvoies le résultat de la
requete

Sinon des liens :
http://dev.mysql.com/doc/mysql/fr/Where_optimisations.html
http://www.nexen.net/docs/mysql/annotee/limit-optimisation.php

Concernant la taille allouée pour les tris c'est dans ton my.ini

> Je pense vraiment que le LIMIT est recalcule a chaque fois; sur une
> requete qui retourne 80.000 tuples (c'est le cas dans mon exemple de
> table articles) le LIMIT 15001,12 (par ex) doit bien effectuer la
> requete integralement, PUIS compter les 15000 premiers tuples pour
> pouvoir se positionner sur le n° 15001 (se qui expliquerait la baisse
> de perf sur les derniers tuples) ?!

Normalement non...




Avatar
free
I.G.LOG wrote:
Bonjour,

Suite à vos conseils, j'ai effectué la requete simple "select * from
articles where qte = 1 order by designation limit 15000,20" avec MySQL
Control Center 0.9.4-beta
Résultat : 20 rows en 0,11 sec. (vive MySQL !)
Ce test est effectué sur mon poste de dev en local, P4-2.6, RAM 1Go.



Donc cela ne vient pas de la requete ! Bonne nouvelle

Jai fait mes premiers essais de LIMIT avec SQLManagerX (SQLTable)



SQLXTable ou SQLCTable , Je dirais SQLXTable car le SQLCTable affiche toute
la table d'un coup.

avec cette requete, sans le where qte=1 (parcours de la table
articles, sans filtre, ordonné sur la clé designation) et j'avais
bien des ralentissements au fur et a mesure que j'avancais par PgDn
vers le bas de la table (instantané sur les premieres pages, mais
vers les enreg 60.000, il fallait environ 10 sec pour afficher la
page). Ces essais ont été fait sur portable PII-233, 196Mo de RAM, en
local. Et, dans ce cas, je ne passe pas par l'acces natif de PCSoft !



OK mais tu compares 2 requetes différentes donc certainement avec 2 plan
d'accès en base différents. dans le 1er ta clause where oblige certainement
MySQL à passer sur l'index et dans la 2ème il fait un access full surtout si
aucun index existe sur désignation. Que donne la requete _SANS_ la clause
where ? Que donne l'explain de ces 2 requetes ?

Donc, je ne comprends pas trop l'origine du probleme (vitesse proc,
mémoire, ... ????)



Non celà vient des requetes.

Pour revenir sur mes essais en cours: j'utilise l'acces natif de
PCsoft, Table fichier pour parcourir la table ARTSERIE (20.000 enreg)
suivant l'index NUMSERIE (clé alpha). Dans le code "affichage d'une
ligne" je fais des recherches sur 7 autres fichiers par
HLitRecherche(). Les trois premieres pages mettent environ 8 à 10 sec
a s'afficher, les suivantes 1 sec (ce qui n'est pas tres "fluide"
comme parcours). Ces resultat sont sur mon poste de dev (P4-2.6,1Go
RAM en local) et je pense que sur le reseau avec des clients moins
performants, ca ne va pas etre genial !



Pourquoi ne pas tout faire en une seule requete ?

As-tu un exemple à m'envoyer (en PV) avec le script de création de base
(cela restera privé bien sur). Je regarderai si tu le veux bien.

Merci encore pour tous vos conseils



De rien

Phil



--
Emmanuel
Avatar
I.G.LOG
Bonjour,

OK mais tu compares 2 requetes différentes donc certainement avec 2 plan
d'accès en base différents. dans le 1er ta clause where oblige


certainement
MySQL à passer sur l'index et dans la 2ème il fait un access full surtout


si
aucun index existe sur désignation. Que donne la requete _SANS_ la clause
where ? Que donne l'explain de ces 2 requetes ?



J'ai fait l'essai SANS la clause where (en second lieu, j'avais fait des
essais avec le where pour "compliquer" la requete et constater les
performances) et de plus DESIGNATION est bien un index (clé alpha sur 80)
"explain select * from article order by designation" donne:
+------+-----+---------------+------------------------------------+---------
+---------+-------+------+
| table | type | possible_keys | key
| key_len | ref | rows | Extra |
| article | index | [NULL] | ARTICLE_DESIGNATION_NDX | 81 |
[NULL] | 66285 | |
+------+-----+---------------+------------------------------------+---------
+---------+-------+------+


> Pour revenir sur mes essais en cours: j'utilise l'acces natif de
> PCsoft, Table fichier pour parcourir la table ARTSERIE (20.000 enreg)
> suivant l'index NUMSERIE (clé alpha). Dans le code "affichage d'une
> ligne" je fais des recherches sur 7 autres fichiers par
> HLitRecherche(). Les trois premieres pages mettent environ 8 à 10 sec
> a s'afficher, les suivantes 1 sec (ce qui n'est pas tres "fluide"
> comme parcours). Ces resultat sont sur mon poste de dev (P4-2.6,1Go
> RAM en local) et je pense que sur le reseau avec des clients moins
> performants, ca ne va pas etre genial !

Pourquoi ne pas tout faire en une seule requete ?



Parce que dans ce cas je ne peux plus utiliser une table fichier (qui existe
deja dans le programme, qui est a l'origine en HF et que je suis en trein de
migrer en MySQL) et je dois reprogrammer la table ou utiliser SQLManagerX
/SQLXTable avec lequel j'ai constate ces performances assez basses (d'ou mes
posts !). Je vais tt de meme essayer de transformer les 7 hlitrecherche en
une seule requete pour voir le gain/perte de perf.

As-tu un exemple à m'envoyer (en PV) avec le script de création de base
(cela restera privé bien sur). Je regarderai si tu le veux bien.



Je prepare ca et j'essaie de te le faire passer

Merci Emmanuel