Bonjour à tous, je suis nouveau sur ce forum.
J'en viens à poster un message car je rencontre un problème depuis quelques années, que j'ai pu détourner jusqu'à maintenant. Mais la je ne veux plus le contourner. alors si quelqu'un a une idée, voici ce qui se passe.
J'ai une requête sous mysql 5.xx sous linux qui est la suivante qui rapatrie pas mal de champs, dont des champs longtext.
La seule présence des champs longtext dans la requête ralentie le temps d'exécution (ou plutôt de rappatriement) de cette dernière.
En exemple cette requête prend environ 1,50 secondes sur un vieux p4 1Ghz avec 512 Mo de ram :
select distinct produitsfiches.BarCode,produitsfiches.Designation, produitsfiches.Designation2,produitsfiches.Marque,produitsfiches.Modele ,produitsfiches.PrixVente ,produitsfiches_complements.PrixInfo ,produitsfiches_complements.PrixPromoInfo ,produitsfiches_complements.EnStock ,produitsfiches_complements.Barcode_Infos ,produitsfiches_complements.Barcode_Infos_Promo ,produitsfiches_complements.Barcode_Infos_Notes ,Flash360,FlashClip,FK_LIVA as IdBurst, VALEUR AS Burst, IMAGE AS VisuelBurst ,Famille,SsFamille,Rayon,Saison from rubrique inner join article_rubrique on RefRub=IdRub inner join produitsfiches on article_rubrique.Barcode=produitsfiches.Barcode inner join produitsfiches_complements on produitsfiches_complements.Barcode=produitsfiches.Barcode left join liste_valeurs_langue on produitsfiches_complements.IdBurst=liste_valeurs_langue.FK_LIVA where article_rubrique.Visible=1 and (FK_LANGUE=1 or FK_LANGUE is null) and VisibleWeb=1 and IdRub in (1,972,968,931,962,777,736,723,725,724,681,20,684,699,717,149,147,146,145,144,16,966,862,873,867,866,865,864,863,700,686,682,128,127,126,125,448,447,446,730,124,14,765,841,830,766,767,807,815,814,813,812,811,810,809,808,769,768,770,773,721,702,776,113,112,410,409,408,407,406,733,111,924,843,832,759,834,403,402,401,400,833,398,397,109,842,831,817,825,824,823,822,821,820,819,818,816,715,388,386,384,703,108,844,382,381,379,378,376,375,104,840,829,775,743,798,803,804,805,806,799,801,800,802,369,367,366,103,839,828,764,789,792,791,793,790,794,795,796,797,774,364,361,100,838,827,728,354,352,351,350,349,348,347,98,942,837,835,826,763,779,788,787,786,785,783,784,782,780,680,336,335,334,333,332,331,11,932,695,687,698,81,79,78,290,77,76,9,67,66,65,64,63,62,61,60,59,58,57,56,55,53,678) order by Marque
si après avoir vidé le cache de mysql, je fais la même requête en ne rapatriant par exemple que le champs Barcode, la requete se fait en 0.60 s environ, soit deux fois moins de temps, mais aussi 10 fois moins de données à rappatrier pour un même nombre de lignes.
select distinct produitsfiches.BarCode from rubrique inner join article_rubrique on RefRub=IdRub inner join produitsfiches on article_rubrique.Barcode=produitsfiches.Barcode inner join produitsfiches_complements on produitsfiches_complements.Barcode=produitsfiches.Barcode left join liste_valeurs_langue on produitsfiches_complements.IdBurst=liste_valeurs_langue.FK_LIVA where article_rubrique.Visible=1 and (FK_LANGUE=1 or FK_LANGUE is null) and VisibleWeb=1 and IdRub in (1,972,968,931,962,777,736,723,725,724,681,20,684,699,717,149,147,146,145,144,16,966,862,873,867,866,865,864,863,700,686,682,128,127,126,125,448,447,446,730,124,14,765,841,830,766,767,807,815,814,813,812,811,810,809,808,769,768,770,773,721,702,776,113,112,410,409,408,407,406,733,111,924,843,832,759,834,403,402,401,400,833,398,397,109,842,831,817,825,824,823,822,821,820,819,818,816,715,388,386,384,703,108,844,382,381,379,378,376,375,104,840,829,775,743,798,803,804,805,806,799,801,800,802,369,367,366,103,839,828,764,789,792,791,793,790,794,795,796,797,774,364,361,100,838,827,728,354,352,351,350,349,348,347,98,942,837,835,826,763,779,788,787,786,785,783,784,782,780,680,336,335,334,333,332,331,11,932,695,687,698,81,79,78,290,77,76,9,67,66,65,64,63,62,61,60,59,58,57,56,55,53,678) order by Marque
J'ai tenté pour l'experience le passage des champs lourds en donnée à null et la requete dans ce cas passe à 1 seconde.
Il est très évident que le select * n'est pas à utiliser, mais que faire quand on doit rapatrier certains champs obligatoirement.
J'ai tenté de jouer sur les paramètre mysql
read_buffer_size
net_buffer_length
sans succès.
Alors si quelq'un a une idée, de mon coté je sèche.
Pour info, le détournement revient à créer des fichiers textes contenant le fameux contenu à rapatrier, et la le problème ne se pose plus, mais la gestion des ecritures, ouvertures des fichiers peut engendrer des problèmes de nombre de fichiers et de lenteur si les disques du serveur ne sont pas formatée en ReiserFs. Et il faut aussi se pencher sur les temps d'ouverture des fichiers et des accès disques quand on remonte de nombreux enregistrements.
Bref, ce n'est pas une solution miracle.
merci de votre contribution si vous avez une solution.
Partager