मान लीजिए आप इस तरह एक प्रश्न है ...व्युत्पन्न तालिका पर अनुक्रमणिका का उपयोग करने के लिए मैं MySQL ऑप्टिमाइज़र को कैसे बताऊं?
SELECT T.TaskID, T.TaskName, TAU.AssignedUsers
FROM `tasks` T
LEFT OUTER JOIN (
SELECT TaskID, GROUP_CONCAT(U.FirstName, ' ',
U.LastName SEPARATOR ', ') AS AssignedUsers
FROM `tasks_assigned_users` TAU
INNER JOIN `users` U ON (TAU.UserID=U.UserID)
GROUP BY TaskID
) TAU ON (T.TaskID=TAU.TaskID)
एकाधिक लोगों को एक दिए गए कार्य को सौंपा जा सकता। इस क्वेरी के प्रयोजन के कार्य प्रति एक पंक्ति को दिखाने के लिए है, लेकिन लोगों को एक एकल स्तंभ
अब में काम करने के लिए आवंटित साथ ... मान लीजिए आप tasks
, users
, और tasks_assigned_users
पर उचित अनुक्रमणिका सेटअप। व्युत्पन्न तालिका में tasks
में शामिल होने पर MySQL ऑप्टिमाइज़र अभी भी TaskID अनुक्रमणिका का उपयोग नहीं करेगा। WTF?!?!?
तो, मेरा सवाल है ... आप इस क्वेरी को functions_assigned_users पर इंडेक्स का उपयोग कैसे कर सकते हैं। TaskID? अस्थायी सारणी लंगड़े हैं, इसलिए यदि यह एकमात्र समाधान है ... MySQL ऑप्टिमाइज़र बेवकूफ है।
इंडेक्स का इस्तेमाल किया:
- कार्यों
- प्राथमिक - TaskID
- उपयोगकर्ताओं
- प्राथमिक - UserID
- tasks_assigned_users
- प्राथमिक - (TaskID, UserID)
- अतिरिक्त सूचकांक अद्वितीय - (UserID, TaskID)
संपादित करें: इसके अलावा, this page का कहना है कि व्युत्पन्न टेबल क्रियान्वित कर रहे हैं/materialized से पहले होने मिलती है । शामिल होने के लिए चाबियों का दोबारा उपयोग क्यों न करें?
संपादित करें 2: यहाँ इस बारे में वास्तव में अच्छा ब्लॉग पोस्ट है: MySQL अनुकूलक आप व्युत्पन्न टेबल पर index hints डाल
संपादित 3 (संभवतः क्योंकि वहाँ व्युत्पन्न टेबल पर कोई अनुक्रमणिका कर रहे हैं) नहीं दूँगा : http://venublog.com/2010/03/06/how-to-improve-subqueries-derived-tables-performance/ ध्यान दें कि केस # 2 वह समाधान है जिसे मैं ढूंढ रहा हूं, लेकिन ऐसा लगता है कि MySQL इस समय इसका समर्थन नहीं करता है। :(
संपादित करें 4: बस this पाया: "MySQL 5.6.3 के रूप में, अनुकूलक और अधिक कुशलता से FROM खंड (अर्थात, व्युत्पन्न टेबल) में सबक्वेरी संभालती है: ... क्वेरी निष्पादन के दौरान, अनुकूलक यह से पंक्ति पुनर्प्राप्ति तेजी लाने के लिए एक व्युत्पन्न मेज पर एक सूचकांक जोड़ सकते हैं। "होनहार लगता है ...
क्या आप जिन इंडेक्स का उपयोग कर रहे हैं उन्हें भी जोड़ सकते हैं? मुझे लगता है कि आपके पास कार्यों पर एक पीके है और task_assigned_users पर एक गैर-अद्वितीय अनुक्रमणिका है। – Luis
@Luis - आपके लिए प्रश्न संपादित किया गया :) – BMiner
आपके पास ग्रुप बाय टास्क आईडी है, जिसका अर्थ है कि कई लोग दिए गए कार्य पर काम कर सकते हैं, जो कुछ समेकन का भी अर्थ है। क्या आप चाहते हैं कि सभी लोगों को कार्य के साथ जुड़े एकल रिटर्न कॉलम में सूचीबद्ध किसी दिए गए कार्य को सौंपा गया हो? या, क्या आप वास्तव में किसी कार्य को सौंपे गए सभी को देखना चाहते हैं, और उन कार्यों को असाइन नहीं किया गया है, इसे खाली करें। हो सकता है कि किसी भी संयुक्त राष्ट्र को सूचीबद्ध सूची के शीर्ष (या नीचे) तक दबाएं ... – DRapp