2012-05-22 12 views
17

हमारे पास MySQL आंतरिक जुड़ने के साथ कुछ विषम समस्याएं हैं। असल में, हमें '=' ​​ऑपरेटर का उपयोग करते समय एक अजीब त्रुटि मिलती है लेकिन 'जैसे' का उपयोग करके यह काम करता है। दुर्भाग्यवश, यह ActiveRecord के माध्यम से है और इसके बजाय 'जैसे' को थप्पड़ मारने का कोई आसान तरीका नहीं है, साथ ही हम यह समझना चाहते हैं कि वास्तव में क्या हो रहा है।MySQL INNER JOIN - '=' बनाम 'जैसे'

ERROR 1296 (HY000): Got error 20008 'Query aborted due to out of query memory' 
from NDBCLUSTER 

क्वेरी कि काम करता है::

mysql> SELECT COUNT(*) FROM `versions` INNER JOIN `site_versions` 
       ON `versions`.id = `site_versions`.version_id; 

यहाँ त्रुटि है:

क्वेरी कि विफल रहता है

mysql> SELECT COUNT(*) FROM `versions` INNER JOIN `site_versions` 
       ON `versions`.id like `site_versions`.version_id; 

यहाँ पर कुछ विवरण हैं टेबल खुद:

mysql> desc site_versions; 
+----------------------+----------+------+-----+---------+----------------+ 
| Field    | Type  | Null | Key | Default | Extra   | 
+----------------------+----------+------+-----+---------+----------------+ 
| id     | int(11) | NO | PRI | NULL | auto_increment | 
| version_id   | int(11) | YES | MUL | NULL |    | 
[..snip..] 
+----------------------+----------+------+-----+---------+----------------+ 

mysql> desc versions; 
+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
[..snip..] 
+------------+--------------+------+-----+---------+----------------+ 

कोई विचार क्यों 'जैसे' काम करता है और '=' नहीं करता है?

+4

वास्तव में आपके द्वारा अपेक्षित परिणाम देने की तरह है? हो सकता है कि यह कुछ भी शामिल होने में असफल रहा हो (क्योंकि चींटियों के लिए क्या मतलब है?) और इसलिए स्मृति समस्या से बचने के लिए वैध क्वेरी ट्रिगर हो रही है। –

+1

@andrewcooke - हम्म, 'जैसे' काम करते समय काम करता प्रतीत होता है: http://sqlfiddle.com/#!2/86792/1 –

+3

यह प्रत्येक क्वेरी के 'व्याख्या' को दिखाने के लिए प्रश्न में भी मदद कर सकता है। –

उत्तर

0

सुनिश्चित नहीं है कि यह आपकी समस्या को ठीक करेगा, लेकिन यह संभव है। count(*) का उपयोग न करें। शायद यह गिनने के बारे में 'भ्रमित' हो रहा है। एक विशिष्ट फ़ील्ड को गिनने के लिए यह सर्वोत्तम अभ्यास है उदा। id। ऐसा करने के लिए, आपको टेबल के लिए उपनाम का उपयोग करने की आवश्यकता है।

SELECT COUNT(v.id) FROM versions as v 
INNER JOIN site_versions as sv ON v.id = sv.version_id; 
+1

या बस स्थिर का उपयोग करें: 'चुनें COUNT (1) से ... ' – bjnord

+4

ओपी के जैसे असामान्य स्थिति में आपके जैसे सुझावों पर बहुत आश्चर्यचकित नहीं होना चाहिए। और मैं नहीं होगा। लेकिन यह कथन, * 'एक विशिष्ट क्षेत्र की गिनती करने का सबसे अच्छा अभ्यास' है, * दूसरे के संदर्भ में बनाया गया है, अर्थात् * 'गिनती (*)' '* का उपयोग न करें, * के लिए सामान्य सलाह की तरह लगता है भविष्य और कम से कम कहने के लिए बहस योग्य है। पंक्तियों या किसी अन्य स्थिति में डेटा के बावजूद किसी समूह में पंक्तियों की गणना करने के लिए 'COUNT (*)' का उपयोग करना पूरी तरह मान्य है और मानक के अनुसार। शायद MySQL में इसके कुछ प्रभाव हैं, लेकिन फिर आपको यह उल्लेख करना पड़ सकता है कि ऐसा ही था। –

+0

@Andriy - मुझे हमेशा यह माना जाता है कि जब संभव हो तो 'गिनती (*)' से बचा जाना चाहिए? यद्यपि वाक्यविन्यास मान्य है और शायद ओप के मुद्दे से संबंधित नहीं है, वास्तव में [एक उल्लेखनीय अंतर प्रदर्शन के अनुसार] (http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/) है। हालांकि मैं डीबीए नहीं हूं, लेकिन डेवलपर ने हमेशा इस वजह से 'गिनती (*) 'से परहेज किया है। मैंने यहां कुछ गलत समझा होगा, अगर मैंने किया तो कृपया मुझे सुराग दें। – stefgosselin

1

मैं कल्पना नहीं कर सकते कि कैसे like इस स्थिति में अच्छी तरह से काम करता है, लेकिन कैसे बस चर MaxAllocate का मूल्य की जाँच और यह बढ़ाने की कोशिश के बारे में? इसका डिफ़ॉल्ट मान 32M है और इसे 1G तक बढ़ाया जा सकता है।

संदर्भ: http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-ndbd-definition.html#ndbparam-ndbd-maxallocate

3

विडंबना यह है कि इस अनुकूलन करने के लिए संबंधित प्रतीत होती है; LIKE का उपयोग करके आप संभव इंडेक्स का उपयोग बंद करने के लिए MySQL को मजबूर करते हैं (कम से कम संख्या कॉलम के साथ, क्योंकि इसे तुलना के लिए स्ट्रिंग करने के लिए उन्हें सभी को कास्ट करना पड़ता है)।

तो = का उपयोग करके ऐसा लगता है कि MySQL सूचकांक का उपयोग करने के लिए बस स्थान (स्मृति/डिस्क) से बाहर चला जाता है (key_buffer सेटिंग जांचें)।

बेशक, यह सिर्फ एक झटका है और मुझे आपकी मदद करने के लिए एनडीबी के बारे में बहुत कुछ पता नहीं है, लेकिन मुझे उम्मीद है कि यह आपको सही दिशा में ले जाएगा।

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