Вопрос

Я задаю этот вопрос от имени небольшой группы моих пользователей, у которых возникла эта проблема.

Как только сценарий, который они используют, достигает 21-го идентификатора, он генерирует следующую ошибку:

Выбор будет изучать больше, чем ряды max_join_size;Проверьте свое место, где и используйте SET SQL_BIG_SELECTS = 1 или установите SQL_MAX_JOIN_SIZE =# Если выбор в порядке

Я изучил это как можно больше и нашел кое-что вроде ответа: http://dev.mysql.com/doc/refman/5.0/en/set-option.html

Проблема в том, что они находятся на общем хостинге и не могут изменить настройки MySQL, чтобы исправить ошибки.

Могу ли я что-нибудь написать в своем сценарии, чтобы у них не возникало этой проблемы?

Это функция, которая генерирует запрос к базе данных на основе загруженных модулей:$sql = 'ВЫБЕРИТЕ a.id в качестве идентификатора, a.address в качестве адреса';

        $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();
Это было полезно?

Решение

MAX_JOIN_SIZE — это предохранительная мера, обычно используемая на общих хостингах.

Это не позволит вам случайно выполнить длинные запросы, которые могут привести к зависанию сервера.

Выполните эту команду:

SET SQL_BIG_SELECTS = 1

перед запуском запроса вы знаете, что возвращаете множество значений.

Другие советы

MAX_JOIN_SIZE достигается, когда MySQL вычисляет декартово произведение соединения, а не фактические ожидаемые обратные записи.Поэтому, если вы присоединяете одну массивную таблицу к другой массивной таблице, это будет увеличиваться.Используйте индексы и представления, чтобы сократить количество возможных обращений к таблице, если она действительно такая большая.

Подробнее смотрите здесь: MySQL — SQL_BIG_SELECTS

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top