Ma Base environ 366 900 photos.
Avant Identification et en sélectionnant la fonction tags, les lignes suivantes s'affichent :
SELECT id, name, url_name, count(*) counter
FROM phpwebgallery_image_tag
INNER JOIN phpwebgallery_tags ON tag_id = id
WHERE image_id IN (669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684,
685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 89238, 89239, 89240, 89241,
................................
................................
de nombreuses lignes s'affichent comme suit
367000, 367001, 367002, 367003, 367004, 367005, 367006, 367007, 367008, 367009,
367010, 367011, 367012, 367013, 367014, 367015, 367016, 367017, 367018, 367019)
GROUP BY tag_id
;
[mysql error 2006] MySQL server has gone away
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in E:\www\phpwebgallery\include\functions_tag.inc.php on line 87
UPDATE phpwebgallery_sessions
SET expiration = now(),
data = ''
WHERE id = '37c2e9bff16b52699fa057e365984a8d'
;
[mysql error 2006] MySQL server has gone away
Après Identification, la fonction génère le même défaut.
Rub a constaté le problème
Merci d'avance pour ton intervention
Dernière modification par patnoe (2007-08-25 08:06:59)
Hors ligne
Hors ligne
MySQL server has gone away
Le serveur est parti, AMHA, parce que la Clause IN est trop longue et dépasse la taille du buffer (tronquée).
Calcul de la longueur du IN:
1->9 c'est x virgule espace càd. 3 caractères = 27
10->99 càd 4 => 90 *4 = 360
100->999 => 900 * 5 = 4500
1000->9999 = 54000
10000->99999 = 630000
100000->367019 = 267020 * 8 = 2136160
C'est plus de 2 Mo.
Il a des grand trou dans la série notre "patnoe".
En plus, je ne connait pas la limite de MySQL mais le pb est là.
Plutôt que de faire une jointure... qui sera exponentielle.
Soit:
1 - J'optimiserai la liste
WHERE (image_id between 669 and 694) or (image_id between 89238 and 89473)
or (image_id between 364810 and 367019)
or image_id IN ( 89247, 12667, ..., 342176 )
2 - Je ferai une liste inverse NOT IN (....)
3 - Je ferai plusieurs requêtes en limitant à 500 valeurs le IN et array_merge() - Cette solution pouvant se cumuler avec les précédentes.
Le découpage de la rêquete ou son optimisation étant sur option d'une $conf
car cela ne concerne que les GROS tagueurs (tes tagueurs fous?).
8-)
Hors ligne
Oui, je sais.
La réponse devrait être immédiate.
C'est pourquoi à mon avis le fait qu'on lui dise "regarde dans cette liste des images" et que la liste est très longue que le serveur coté MySQL se plante car la demande est finalement trop longue dans le texte.
8-)
Hors ligne
J'ai testé et le gone away répond immédiatement ce qui me fait imaginer ce pb.
8-)
Hors ligne
La requête fait 2,72 Mo (2 855 585 octets).
8-)
Hors ligne
Pourrais-tu me mettre dans un groupe où je ne verrai que la moitié des catégories...?
Histoire de voir si à moins de 2Mo la requête est traitée normalement et répond instantanément.
8-)
Hors ligne
Nouveau pb (de quoi inquiéter vimages)...
SELECT DISTINCT image_id
FROM phpwebgallery_image_category
WHERE (category_id NOT IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,..,12770,12771,12772,12773,12774,12775,12776,12777,12778,12779,12780,))
;
[mysql error 1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '))' at line 3
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in E:\www\phpwebgallery\include\functions.inc.php on line 884
soit
WHERE (category_id NOT IN (1,2,3,4,5,...,12776,12777,12778,12779,12780,))
near )) c'est la virgule sans doute mais...
Monsieur MySQL, cette requête, plus simple, tourne des milliers de fois par jour.
8-(
Hors ligne
VDigital a écrit:
Plutôt que de faire une jointure... qui sera exponentielle.
Soit:
1 - J'optimiserai la liste
WHERE (image_id between 669 and 694) or (image_id between 89238 and 89473)
or (image_id between 364810 and 367019)
or image_id IN ( 89247, 12667, ..., 342176 )
Je ne suis pas d'accord sur ce cas précis car c'est TOUTE la table image qui est passé en paramètre et par la suite les id images ne sont plus utilisés.
Exponentiel surement pas si les indexes sont correctes (bien au contraire)
Tes autres méthodes fonctionnent bien sur correctement mais dans tes cas où la liste des id est partiel et pas full.
Hors ligne
VDigital a écrit:
Nouveau pb (de quoi inquiéter vimages)...
SELECT DISTINCT image_id
FROM phpwebgallery_image_category
WHERE (category_id NOT IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,..,12770,12771,12772,12773,12774,12775,12776,12777,12778,12779,12780,))
;
[mysql error 1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '))' at line 3
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in E:\www\phpwebgallery\include\functions.inc.php on line 884soit
WHERE (category_id NOT IN (1,2,3,4,5,...,12776,12777,12778,12779,12780,))
near )) c'est la virgule sans doute mais...
Monsieur MySQL, cette requête, plus simple, tourne des milliers de fois par jour.
8-(
Une solution simple et rapide est de passer par la table #cache et par jointure.
Le seule endroit ou ce n'est pas applicable c'est lors de l'alimentation de la table #cache mais il y a plusieurs méthodes pour le faire.
Hors ligne
VDigital a écrit:
Le découpage de la rêquete ou son optimisation étant sur option d'une $conf
car cela ne concerne que les GROS tagueurs (tes tagueurs fous?).
patnoe est un tagueurs à zéro tag!! ;-)
Hors ligne
J'ai bien compris... Reste que
WHERE image_id IN (669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684,
685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 89238, 89239, 89240, 89241,
................................
................................
dépasse les 2.7Mo
8-)
Hors ligne
rub a écrit:
Une solution simple et rapide est de passer par la table #cache et par jointure.
Le seule endroit ou ce n'est pas applicable c'est lors de l'alimentation de la table #cache mais il y a plusieurs méthodes pour le faire.
Je suis pour laisser MySql se debrouiller ... Il y a des chances qu'il optimise bien les requetes ...
Hors ligne
Ce n'est pas faux...
8-)
Hors ligne