Changeset 94721 in spip-zone


Ignore:
Timestamp:
Jan 23, 2016, 2:37:37 PM (4 years ago)
Author:
cedric@…
Message:

Report de r94720 : Perf issue retour sur r94692 et retour des sous requetes :

  • les sous requetes dans un IN sont lentes a cause d'un bug de mysql qui les interprete en correlated queries. Consequence, la sous requete est executee pour chaque ligne de la requete principale, ce qui fait exploser le temps de requete totale, de complexite m*n

Reference :
https://dev.mysql.com/doc/refman/5.5/en/correlated-subqueries.html
http://bugs.mysql.com/bug.php?id=9090

  • On peut contourner le bug en emballant la sous-requete dans un (SELECT * FROM(...) AS subquery). Elle redevient uncorrelated, executee une seule fois, et on retrouve la perf mysql attendue, meilleure qu'en rapatriant les resultats dans PHP et en les reinjectant dans la requete principale

cf http://stackoverflow.com/questions/6135376/mysql-select-where-field-in-subquery-extremely-slow-why#6157797

Location:
_plugins_/polyhierarchie/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/polyhierarchie/trunk

  • _plugins_/polyhierarchie/trunk/paquet.xml

    r94693 r94721  
    22        prefix="polyhier"
    33        categorie="navigation"
    4         version="3.1.0"
     4        version="3.2.0"
    55        etat="test"
    66        compatibilite="[3.0.0;3.1.*]"
  • _plugins_/polyhierarchie/trunk/polyhier_fonctions.php

    r94693 r94721  
    4949                $type = objet_type($boucle->type_requete);
    5050                $cond = "is_array(\$r=$arg)?sql_in('rl.id_parent',\$r):'rl.id_parent='.\$r";
    51                 $sous = "sql_allfetsel('rl.id_objet','spip_rubriques_liens as rl',$cond.' AND rl.objet=\'$type\'')";
    52                 $where[] = "sql_in('".$boucle->id_table.".".$boucle->primary."', array_map('reset',$sous))";
     51                $sous = "sql_get_select('rl.id_objet','spip_rubriques_liens as rl',$cond.' AND rl.objet=\'$type\'')";
     52                $where[] = "array('IN', '".$boucle->id_table.".".$boucle->primary."', '(SELECT * FROM('.$sous.') AS subquery)')";
    5353        }
    5454        if (count($where)==2)
     
    9999                $arg = kwote(calculer_argument_precedent($idb, id_table_objet(objet_type($boucle_parent->type_requete)), $boucles));
    100100                $type = objet_type($boucle_parent->type_requete);
    101                 $sous = "sql_allfetsel('rl.id_parent','spip_rubriques_liens as rl','rl.id_objet='.$arg.' AND rl.objet=\'$type\'')";
    102                 $where[] = "sql_in('$primary', array_map('reset',$sous))";
     101                $sous = "sql_get_select('rl.id_parent','spip_rubriques_liens as rl','rl.id_objet='.$arg.' AND rl.objet=\'$type\'')";
     102                $where[] = array("'IN'", "'$primary'", "'(SELECT * FROM('.$sous.') AS subquery)'");
    103103        }
    104104        if (count($where)==2)
     
    196196                $type = objet_type($boucle->type_requete);
    197197                $primary = $boucle->id_table.".".$boucle->primary;
    198                 $sous = "sql_allfetsel('rl.id_objet','spip_rubriques_liens as rl',sql_in('rl.id_parent',\$b" . ($not ? ", 'NOT'" : '') . ").' AND rl.objet=\'$type\'')";
    199                 $where[] = "sql_in('$primary', array_map('reset',$sous))";
     198                $sous = "sql_get_select('rl.id_objet','spip_rubriques_liens as rl',sql_in('rl.id_parent',\$b" . ($not ? ", 'NOT'" : '') . ").' AND rl.objet=\'$type\'')";
     199                $where[] = "array('IN', '$primary', '(SELECT * FROM('.$sous.') AS subquery)')";
    200200        }
    201201
Note: See TracChangeset for help on using the changeset viewer.