Domanda

Sto ponendo questa domanda per conto di un piccolo gruppo di miei utenti che hanno questo problema.

Una volta che lo script che stanno utilizzando arriva al 21° ID, genera il seguente errore:

La selezione esaminerebbe più di Max_Join_Size ROWS;controlla il tuo DOVE e utilizzare SET SQL_BIG_SELECTS=1 o SET SQL_MAX_JOIN_SIZE=# se l'opzione SELECT è ok

Ho studiato il più possibile e ho trovato una risposta: http://dev.mysql.com/doc/refman/5.0/en/set-option.html

Il problema è che si trovano su un hosting condiviso, quindi non possono modificare le impostazioni MySQL per correggere gli errori.

C'è qualcosa che posso scrivere nel mio script in modo che non abbiano questo problema?

Questa è la funzione che genera la query del database in base a quali moduli vengono caricati:$sql = 'SELEZIONA a.id come id, a.address come indirizzo';

        $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();
È stato utile?

Soluzione

MAX_JOIN_SIZE è una presa di sicurezza comunemente utilizzata sugli hosting condivisi.

Non ti consentirà di eseguire accidentalmente query lunghe che bloccherebbero il server.

Emetti questo comando:

SET SQL_BIG_SELECTS = 1

prima di eseguire la query sai che restituirà molti valori.

Altri suggerimenti

MAX_JOIN_SIZE viene raggiunto quando MySQL calcola il prodotto cartesiano di un join, non i record effettivi previsti.Pertanto, se stai unendo un tavolo enorme a un altro tavolo enorme, questo si insinuerà.Utilizza indici e visualizzazioni per ridurre i possibili risultati della tabella se è davvero così grande.

Vedi di più qui: MySQL-SQL_BIG_SELECTS

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top