سؤال

أنا أسأل هذا السؤال نيابة عن مجموعة صغيرة من مستخدمي الذين لديهم هذه المشكلة.

بمجرد أن يستخدم البرنامج النصي الذي يستخدمونه في المعرف الحادي والعشرين، يولد الخطأ التالي:

سيفحص المحدد أكثر من 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 = 'SELECT 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