मैं निम्न क्वेरीMySQL: कैसे सूचकांक एक "या" खंड
SELECT COUNT(*)
FROM table
WHERE field1='value' AND (field2 >= 1000 OR field3 >= 2000)
वहाँ फ़ील्ड 1 के ऊपर एक सूचकांक है और एक अन्य field2 & फ़ील्ड 3 से अधिक की संयुक्त क्रियान्वित कर रहा हूँ करने के लिए।
मुझे लगता है कि MySQL हमेशा फील्ड 1 इंडेक्स का चयन करता है और फिर अन्य दो फ़ील्ड का उपयोग करके जुड़ जाता है जो काफी खराब है क्योंकि इसे 146.000 पंक्तियों में शामिल होने की आवश्यकता है।
इसे कैसे सुधारें इस पर सुझाव? धन्यवाद
मैं Mysql पर इस देखा है प्रस्तावित
समाधान में आधारित (प्रस्तावित समाधान की कोशिश के बाद संपादित करें) जब इस के साथ खेल रहा है।
SELECT COUNT(*) FROM (SELECT * FROM table WHERE columnA = value1
UNION SELECT * FROM table WHERE columnB = value2) AS unionTable;
की तुलना में बहुत धीमी है निष्पादित करें:
SELECT COUNT(*)
FROM table
WHERE (columnA = value1 AND columnB = value2)
OR (columnA = value1 AND columnC = value3)
दो कंपोज़िट सूचकांक होने:
index1 (columnA,columnB)
index2 (columnA,columnC)
काफी दिलचस्प है कि Mysql पूछ "समझाने" करने के लिए क्वेरी यह हमेशा index1 पर ले रहा है दोनों मामलों और सूचकांक 2 का उपयोग नहीं किया जाता है। क्वेरी के लिए
index1 (columnB,columnA)
index2 (columnC,columnA)
और::
SELECT COUNT(*)
FROM table
WHERE (columnB = value2 AND columnA = value1)
OR (columnC = value3 AND columnA = value1)
तो यह सबसे तेज़ तरीका मैंने पाया Mysql काम करता है
अगर मैं करने के लिए अनुक्रमित बदल जाते हैं।
आपको एक बग है: आप तत्वों है कि दोनों मानदंडों को पूरा गिनती कर रहे हैं (जहां 'field2> = 1000' * और *' फ़ील्ड 3> = 2000') दो बार। (संकेत: एक अस्थायी तालिका का उपयोग करें;)) – soulmerge
यूनियन डिफ़ॉल्ट रूप से यूनियन डिस्टिंट है। यूनियन निर्माण के हिस्से के रूप में डुप्लिकेट पंक्तियां हटा दी जाती हैं। यदि कोई वास्तव में उन्हें दो बार गिनना है, तो कोई 'यूनियन ऑल' का उपयोग करेगा। क्या आपने अपनी खुद की कुछ समान तालिका पर सुझाए गए कथन का भी प्रयास किया था? –