Valider d4c1615e rédigé par cedric@yterium.com's avatar cedric@yterium.com
Parcourir les fichiers

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
parent 4da3e213
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<paquet
	prefix="polyhier"
	categorie="navigation"
	version="2.1.0"
	version="2.2.0"
	etat="stable"
	compatibilite="[3.0.0;3.1.*]"
	logo="images/polyhier-32.png"
+6 −6
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -48,8 +48,8 @@ function critere_enfants($idb, &$boucles, $crit, $tous=true) {
	  AND in_array(table_objet_sql($boucle->type_requete),array_keys(lister_tables_objets_sql()))){
		$type = objet_type($boucle->type_requete);
		$cond = "is_array(\$r=$arg)?sql_in('rl.id_parent',\$r):'rl.id_parent='.\$r";
		$sous = "sql_allfetsel('rl.id_objet','spip_rubriques_liens as rl',$cond.' AND rl.objet=\'$type\'')";
		$where[] = "sql_in('".$boucle->id_table.".".$boucle->primary."', array_map('reset',$sous))";
		$sous = "sql_get_select('rl.id_objet','spip_rubriques_liens as rl',$cond.' AND rl.objet=\'$type\'')";
		$where[] = "array('IN', '".$boucle->id_table.".".$boucle->primary."', '(SELECT * FROM('.$sous.') AS subquery)')";
	}
	if (count($where)==2)
		$where = array("'OR'",$where[0],$where[1]);
@@ -98,8 +98,8 @@ function critere_parents($idb, &$boucles, $crit, $tous=true) {
	  AND in_array(table_objet_sql($boucle_parent->type_requete),array_keys(lister_tables_objets_sql()))){
		$arg = kwote(calculer_argument_precedent($idb, id_table_objet(objet_type($boucle_parent->type_requete)), $boucles));
		$type = objet_type($boucle_parent->type_requete);
		$sous = "sql_allfetsel('rl.id_parent','spip_rubriques_liens as rl','rl.id_objet='.$arg.' AND rl.objet=\'$type\'')";
		$where[] = "sql_in('$primary', array_map('reset',$sous))";
		$sous = "sql_get_select('rl.id_parent','spip_rubriques_liens as rl','rl.id_objet='.$arg.' AND rl.objet=\'$type\'')";
		$where[] = array("'IN'", "'$primary'", "'(SELECT * FROM('.$sous.') AS subquery)'");
	}
	if (count($where)==2)
		$where = array("'OR'",$where[0],$where[1]);
@@ -204,8 +204,8 @@ function critere_branche($idb, &$boucles, $crit, $tous='elargie') {
	  AND in_array(table_objet_sql($boucle->type_requete),array_keys(lister_tables_objets_sql()))){
		$type = objet_type($boucle->type_requete);
		$primary = $boucle->id_table.".".$boucle->primary;
		$sous = "sql_allfetsel('rl.id_objet','spip_rubriques_liens as rl',sql_in('rl.id_parent',\$b" . ($not ? ", 'NOT'" : '') . ").' AND rl.objet=\'$type\'')";
		$where[] = "sql_in('$primary', array_map('reset',$sous))";
		$sous = "sql_get_select('rl.id_objet','spip_rubriques_liens as rl',sql_in('rl.id_parent',\$b" . ($not ? ", 'NOT'" : '') . ").' AND rl.objet=\'$type\'')";
		$where[] = "array('IN', '$primary', '(SELECT * FROM('.$sous.') AS subquery)')";
	}

	if (count($where)==2)