OVH Cloud OVH Cloud

WD12 et MySQL

16 réponses
Avatar
I.G.LOG
Bonjour

J'ai une appli avec accès natif MySQL.
Sur les tables fichiers la recherche avec loupe est très longue. A titre
d'exemple, une recherche avec la loupe de la réf. "B-3339" sur un fichier
articles contenant 100.000 enreg. prend environ 15 secondes... les
utilisateurs râlent bien sur.
Le problème vient du fait que j'ai un filtre sur le fichier positionné avec
le code suivant:

gFiltre = "IDTYPE = 4 et TERMINE = 0"
hFiltre(TABLE..FichierParcouru,TABLE..RubriqueParcourue,Caract(0),Caract(255
),gFiltre)

Ce filtre permet de sélectionner les article de type "article" (IDTYPE = 4)
toujours actifs (TERMINE = 0).
IDTYPE est indexé, TERMINE est non indexé. La rubrique de parcours REFCONST
est indexée.

Sans le filtre, la recherche s'effectue 2 fois plus vite (ce qui n'est pas
génial non plus d'ailleurs)

Voyez vous une solution pour que la recherche soit plus rapide ?

Merci à tous

6 réponses

1 2
Avatar
Daniel
I.G.LOG a écrit :
Bonsoir

Je viens de faire des essais de positionnement sur la table fichier
"articles" avec le code suivant

hlitrecherche(article,REFCONST,"B-3339") // Résultat instantané
TableAffiche(article,tacourantpremier) // Prend 15 secondes
!!!!

En fait, c'est le tableaffiche() qui met énormément de temps !
Et je ne connais pas d'autre focntion pour se positionner dans une table
fichier :-(
J'ai peur de devoir changer complètement de stratégie pour afficher les
articles.
A moins que vous ne voyez une solution pour afficher rapidement la table
après un positionnement "manuel" ?!

Encore merci pour vos réponses





Branche les logs sur ta base

http://dev.mysql.com/doc/refman/5.0/fr/query-log.html

si pas possible car poste distant, utilise Ethereal avec le filtre
tcp.port == 3306

Si tu veux de la vitesse travaille avec des tables mémoires et passe par
tes propres requêtes SQL.

Peux tu tester avec un outil Mysql, le temps d'une requête
SELECT count(*) from article


--
suivre ce lien pour répondre:
http://cerbermail.com/?2KrV3YZXnn
Daniel
;-)
Avatar
I.G.LOG
>
Branche les logs sur ta base

si pas possible car poste distant, utilise Ethereal avec le filtre
tcp.port == 3306



Bonjour,
Je vais essayer les logs et Ethereal (je ne connais ni l'un ni l'autre).
J'ai déjà commencé à passer la table fichier en table mémoire: les
performances sont incomparables, avec le code suivant pour afficher une page
d'articles, c'est instantané:

TableSupprimeTout(TABLE)
lCond = "select REFCONST,IDARTICLE,DESIGNATION from article where REFCONST
>= '" + MoiMême + "' order by REFCONST limit 0," +
TableOccurrence(TABLE,toVisible)
SI SQLExec(lCond,"Req1") ALORS
SQLTable("Req1",TABLE)
FIN
SQLFerme("Req1")
TableSelectPlus(TABLE,1)

La difficulté reste maintenant de gérer la navigation avec l'ascenseur (plus
compliqué si on veut remonter dans la table !!).

Peux tu tester avec un outil Mysql, le temps d'une requête
SELECT count(*) from article





sur ma base locale (identique à celle de mon client) ca me donne: 1 ligne
dans le résultat (0.01) sec
J'essaie demain chez le client

Encore merci pour tes réponses
Avatar
Daniel
I.G.LOG a écrit :
Branche les logs sur ta base

si pas possible car poste distant, utilise Ethereal avec le filtre
tcp.port == 3306



Bonjour,
Je vais essayer les logs et Ethereal (je ne connais ni l'un ni l'autre).
J'ai déjà commencé à passer la table fichier en table mémoire: les
performances sont incomparables, avec le code suivant pour afficher une page
d'articles, c'est instantané:

TableSupprimeTout(TABLE)
lCond = "select REFCONST,IDARTICLE,DESIGNATION from article where REFCONST
>= '" + MoiMême + "' order by REFCONST limit 0," +
TableOccurrence(TABLE,toVisible)
SI SQLExec(lCond,"Req1") ALORS
SQLTable("Req1",TABLE)
FIN
SQLFerme("Req1")
TableSelectPlus(TABLE,1)

La difficulté reste maintenant de gérer la navigation avec l'ascenseur (plus
compliqué si on veut remonter dans la table !!).

Peux tu tester avec un outil Mysql, le temps d'une requête
SELECT count(*) from article





sur ma base locale (identique à celle de mon client) ca me donne: 1 ligne
dans le résultat (0.01) sec
J'essaie demain chez le client

Encore merci pour tes réponses





Tu es en InnoDb ou en MyISAM

--
suivre ce lien pour répondre:
http://cerbermail.com/?2KrV3YZXnn
Daniel
;-)
Avatar
I.G.LOG
>
Tu es en InnoDb ou en MyISAM




euh... j'ai 8 tables en innodb sur 61 en tout. je ne sais pas pkoi ces
tables sont définies en innodb !
Est ce que c'est important, et dois je les définir en MyIsam ?
Avatar
Daniel
I.G.LOG a écrit :
Tu es en InnoDb ou en MyISAM




euh... j'ai 8 tables en innodb sur 61 en tout. je ne sais pas pkoi ces
tables sont définies en innodb !
Est ce que c'est important, et dois je les définir en MyIsam ?





En fait les tables innodb permettent de fonctionner en transactionnel et
d'appliquer des règles d'intégrité.

Avantage de MyISAM très rapide mais pas de transactionnel
Avantage de InnoDB sécurité des données, mais très lent (dans certains
cas) si innodb

Un SELECT count(*) FROM table sur une table innodb avec plusieurs
millions de lignes dépasse la minute lorsque le même sur MyISAM est
immédiat.

Car pour faire un count(*), innodb doit balayer tout l'index!!!

Je pense que ton problème de lenteur vient de là, car Windev en
automatique dans les tables envoie au moins 2 select count(*).


Attention sur myIsam, ou innodb un select count(*) from table Where
condition est identique car on fait une recherche avant de calculer la
valeur.

--
suivre ce lien pour répondre:
http://cerbermail.com/?2KrV3YZXnn
Daniel
;-)
Avatar
I.G.LOG
Merci pour ces renseignements.
Mais ma table article est elle en MyIsam, donc la lenteur ne vient pas de
là...
Je pense plutot que c'est bien le TableAffiche() qui est en cause. Je suis
en train de basculer l'affichage en table mémoire, et là, plus de lenteurs.
Encore merci pour vos réponses
1 2