2009-06-08 8 views
6

मैं इस समस्या को अपने उपयोगकर्ताओं के एक छोटे समूह की ओर से पूछ रहा हूं जिसमें यह समस्या है।MySQL MAX_JOIN_SIZE त्रुटियां

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

मैं संभव के रूप में इस के रूप में ज्यादा शोध किया और एक जवाब के बारे में कुछ पाया है: http://dev.mysql.com/doc/refman/5.0/en/set-option.html

एक बार स्क्रिप्ट वे उपयोग कर रहे 21 वीं आईडी के लिए हो जाता है, यह निम्न त्रुटि उत्पन्न करता है समस्या यह है कि वे साझा होस्टिंग पर हैं ताकि वे त्रुटियों को ठीक करने के लिए अपनी 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(); 
+0

आप पूरी तरह से सुनिश्चित हैं कि क्वेरी अनुकूलित है, यानी कम मध्यस्थ परिणाम सेट के साथ एक ही परिणाम प्राप्त करने का कोई तरीका नहीं है? – VolkerK

उत्तर

13

MAX_JOIN_SIZE अधिक साझा hostings पर इस्तेमाल किया एक सुरक्षा पकड़ है।

यह आपको गलती से लंबे प्रश्नों को चलाने नहीं देगा जो सर्वर को लटकाएंगे।

जारी इस आदेश:

SET OPTION SQL_BIG_SELECTS = 1 

क्वेरी आप मूल्यों के बहुत सारे वापस जाने के लिए पता चलने से पहले।

4

MAX_JOIN_SIZE हिट हो जाता है जब MySQL एक में शामिल होने के लिए, वापस वास्तविक उम्मीद रिकॉर्ड नहीं की कार्तीय उत्पाद गणना करता है। इसलिए, यदि आप एक बड़ी मेज पर एक विशाल मेज में शामिल हो रहे हैं, तो यह रेंग जाएगा। संभावित तालिका हिट को कम करने के लिए इंडेक्स और दृश्यों का उपयोग करें यदि यह वास्तव में बड़ा है।

अधिक देखें: MySQL - SQL_BIG_SELECTS

संबंधित मुद्दे