2009-06-03 14 views
10

मैं PHP और MySQL का उपयोग कर रहा हूं। मेरे कार्यक्रम में शामिल होने वाली एक चुनिंदा क्वेरी है। जब मैं स्थानीय होस्ट पर चला यह ठीक काम कर रहा है, लेकिन जब मैं अपने सर्वर पर अपलोड करें और फिर इसे निष्पादित करने के लिए यह निम्न त्रुटि उत्पन्न करता है कोशिश:MySQL: "SELECT 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

मैं यह कैसे सही कर सकते हैं?

+0

पर चयन की @@ MAX_JOIN_SIZE मूल्य क्या है हमारे सर्वर? चुनें @@ MAX_JOIN_SIZE; शायद यह अनुचित कम है या आपकी क्वेरी हो सकती है ... suboptimal। – VolkerK

+0

इस समस्या का अच्छा जवाब यहां है: http://stackoverflow.com/a/950576/325365 –

उत्तर

8

एक प्रश्न पिछले क्रियान्वित करने के रूप में चलाने की कोशिश अपने चयन:

SET SQL_BIG_SELECTS=1 

यह वास्तव में एक बहुत बड़ा डाटासेट अधिक क्रियान्वित है? यदि नहीं, तो इसे अलग तरीके से हल किया जाना चाहिए।

3

पैरामीटर का प्रभाव http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_max_join_size पर प्रलेखित किया गया है।

आपको शामिल रिकॉर्ड्स को अधिक सख्ती से फ़िल्टर करना चाहिए (इसलिए क्वेरी के प्रत्येक भाग में कम रिकॉर्ड शामिल हैं)। यदि संभव हो तो तालिका के साथ शुरू करें जहां आप एक साधारण WHERE-Clause के साथ अधिकांश रिकॉर्ड फ़िल्टर कर सकते हैं।

0

मैं एक ही समस्या में भाग गया है। इसकी एक ड्रोपल साइट इतनी आश्चर्य की बात नहीं है कि यह खत्म हो गया।

यह यानी Select blah From table1, table2, table3 Where table1.id=table2.id And table2.some = 'thing' एक पुरानी शैली क्वेरी था,

तरह @VolkerK कहते हैं, समाधान जहां खंड है कि जो table2 को table1 (प्रभावी रूप से खंड में शामिल होने) मेल खाने वाले पहले table2 फ़िल्टर किए गए परिणामों को स्थानांतरित करने का था, इस प्रकार कम हो रही तालिका 1 में तालिका 2 में मिलान करने के लिए आवश्यक रिकॉर्ड्स की मात्रा।

17

PHP का उपयोग करते समय, SQL_BIG_SELECTS = 1 को आपकी मुख्य क्वेरी से पहले एक अलग क्वेरी में सेट किया जाना चाहिए। उदाहरण के लिए:

$mysqli = new mysqli("localhost", "root", "password", "db"); 

$mysqli->query("SET SQL_BIG_SELECTS=1"); //Set it before your main query 

$results = $mysqli->query("SELECT a, b, c FROM test"); 
while($row = $results->fetch_assoc()){ 
    echo '<pre>'; 
    print_r ($row); 
    echo '</pre>'; 
} 
+0

हाँ यह ठीक काम कर रहा है। धन्यवाद... – Chinmay235

0

मेरे लिए समाधान मिलान करने के लिए उपयोग किए जाने वाले सभी कॉलम में इंडेक्स कुंजी जोड़ना था।

0

आप पीडीओ चालक का उपयोग कर रहे हैं, तो PDO::MYSQL_ATTR_INIT_COMMAND अपने driver_options में सरणी जब निर्माण एक नया डेटाबेस संभाल

इसलिए की तरह सेट:

$dbh = new PDO('mysql:host=xxx;port=xxx;dbname=xxx', 'xxx', 'xxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET SESSION SQL_BIG_SELECTS=1')); 
संबंधित मुद्दे