2009-06-08 13 views
6

Estoy haciendo esta pregunta en nombre de un pequeño grupo de mis usuarios que tienen este problema.MySQL MAX_JOIN_SIZE errors

Una vez que la secuencia de comandos que están utilizando se pone al ID 21, se genera el siguiente error:

The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay

He investigado esto tanto como sea posible y encontrado algo de una respuesta: http://dev.mysql.com/doc/refman/5.0/en/set-option.html

El El problema es que están en hosting compartido por lo que no pueden cambiar su configuración de MySQL para corregir los errores.

¿Hay algo que pueda escribir en mi script para que no tengan este problema?

Esta es la función que genera la consulta de la base de datos en función de qué módulos están cargados: $ sql = 'SELECCIONE aid como id, a.address como dirección';

 $query = 'SELECT' 
       . ' name AS module_name' 
       . ', databasename AS module_database' 
       . ', pregmatch AS module_pregmatch' 
       . ', pregmatch2 AS module_pregmatch2' 
       . ', html AS module_html' 
       . ', sqlselect AS database_sqlselect' 
       . ', sqljoin AS database_sqljoin' 
       . ', sqlupdatewithvalue AS database_sqlupdatewithvalue' 
       . ', sqlupdatenovalue AS database_sqlupdatenovalue' 
       . ' FROM #__aqsgmeta_modules' 
       . ' WHERE enabled = 1' 
       . ' ORDER BY id';      
     $db->setQuery($query); 
     $results = $db->loadObjectList(); 
     if (count($results) != 0) { 
      foreach ($results as $result) { 
       $sqlselect .= ', '; 
       $sqlselect .= $result->database_sqlselect; 

       $sqljoin .= ' '; 
       $result->database_sqljoin = preg_replace('/\{DATABASENAME\}/Ui', $result->module_database, $result->database_sqljoin); 
       if (!(preg_match("/" . $result->database_sqljoin . "/Ui", $sqljoin))) 
        $sqljoin .= $result->database_sqljoin; 
      } 
     } 

     if ($use_sh404sef) 
      $sqlselect .= ', g.oldurl AS sefurl'; 
     $sql .= $sqlselect; 
     $sql .= ' FROM #__aqsgmeta_address AS a'; 
     $sql .= $sqljoin; 

     if ($use_sh404sef) 
      $sql .= ' LEFT JOIN #__redirection AS g ON g.newurl = a.address'; 

     $sql .= 
     //. ' WHERE a.id IN (' . $cids . ')' 
     ' WHERE a.id = ' . $id 
     . ' ORDER BY a.address asc,a.id ' 
     ; 
     $db->setQuery($sql); 
     $rows = $db->loadObjectList(); 
+0

¿Está absolutamente seguro de que la consulta está optimizada, es decir, no hay forma de obtener el mismo resultado con menos conjuntos de resultados intermedios? – VolkerK

Respuesta

13

MAX_JOIN_SIZE es un cierre de seguridad comúnmente utilizado en los hostings compartidos.

No le permitirá accidentalmente ejecutar largas consultas que colgarían el servidor.

este comando:

SET OPTION SQL_BIG_SELECTS = 1 

antes de ejecutar la consulta que sabe volver un montón de valores.

4

El MAX_JOIN_SIZE es golpeado cuando MySQL calcula el producto cartesiano de una unión, no los registros reales esperados espalda. Por lo tanto, si te estás uniendo a una mesa masiva a otra mesa masiva, esto se arrastrará hacia arriba. Use índices y vistas para reducir las posibles visitas a la tabla si es realmente tan grande.

Ver más aquí: MySQL - SQL_BIG_SELECTS

Cuestiones relacionadas