2009-09-05 21 views
7

मैं अपने mysql प्रश्नों को अनुकूलित करने का प्रयास कर रहा हूं ताकि 'फाइलों का उपयोग करके अस्थायी रूप से उपयोग' से बच सकें। मुझे कुछ मदद इस्तेमाल करनी थी। प्रथम; यहाँफाइल्सोर्ट का उपयोग mysql में एक बुरा विचार का उपयोग कर अस्थायी का उपयोग कर?

समझाने यहाँ क्वेरी

select pf.*,m.login,m.avatar 
from profile_friends pf, members m 
where pf.friend_id = m.id and pf.member_id = 16586 
order by m.lastLogin desc 
limit 0,24; 


mysql> EXPLAIN select pf.*,m.login,m.avatar from profile_friends pf, members m where pf.friend_id = m.id and pf.member_id = 16586 order by m.lastLogin desc limit 0,24; 
+----+-------------+-------+--------+-----------------------------------------------------+-----------------+---------+--------------------------+------+----------------------------------------------+ 
| id | select_type | table | type | possible_keys          | key    | key_len | ref      | rows | Extra          | 
+----+-------------+-------+--------+-----------------------------------------------------+-----------------+---------+--------------------------+------+----------------------------------------------+ 
| 1 | SIMPLE  | pf | ref | member_id_index,friend_id_index      | member_id_index |  4 | const     | 160 | Using where; Using temporary; Using filesort | 
| 1 | SIMPLE  | m  | eq_ref | PRIMARY,member_id_privacy_index,id_last_login_index | PRIMARY   |  4 | mydb.pf.friend_id  | 1 | Using where         | 

है 2 टेबल शामिल हैं। प्रोफाइल फ्रेंड (पीएफ), और सदस्य (एम)। यह क्वेरी सिर्फ इस विशेष सदस्य आईडी के लिए 'हालिया' 24 मित्रों को खोजने का प्रयास कर रही है। हालिया साधन LastLogin दिनांक द्वारा क्रमबद्ध करें।

धन्यवाद

उत्तर

17

यह एक समस्या है? हाँ।

क्या आप 160 पंक्तियों से निपटने में समस्या रखते हैं? नहीं।

"फाइलोर्ट" एक विधि है, न कि फ़ाइल की वास्तविक रचना और इसे सॉर्ट करना। अगर हम 160 पंक्तियों की बजाय 160,000 पंक्तियों के बारे में बात कर रहे थे, तो शायद अधिक अनुकूलन पर विचार करने का कारण होगा।

संपादित करें: इसके अलावा, आपने वास्तविक क्वेरी चलने का समय छोड़ा है। आप इंडेक्स को मार रहे हैं और केवल कुछ पंक्तियों के साथ काम कर रहे हैं। यदि यह क्वेरी एक सेकंड के एक अंश के अंश से अधिक ले रही है, तो शायद यह अनुकूलन की तलाश में भी लायक नहीं है।

+3

+1 हां, 160 पंक्तियों के लिए MySQL डिस्क पर लिखने के बिना, टेम्पलेट तालिका को स्मृति में भी रख सकता है। "फाइलोर्ट" थोड़ा भ्रामक है, इसका मतलब यह है कि यह इंडेक्स के लाभ के बिना सॉर्टिंग कर रहा है। –

1

यह क्वेरी लिखने का सबसे प्रभावी तरीका है।

सुनिश्चित करें कि pf.friend_id, pf.member_id, और m.id पर उनके सूचकांक हैं। फिर यह तालिकाओं में शामिल होने और परिणामों को फ़िल्टर करने के लिए सूचकांक का उपयोग करेगा।

यह order by की वजह से, वैसे भी आने वाला है।

+4

MySQL या तो 'pf.friend_id' या' pf.member_id' पर इंडेक्स का उपयोग करेगा, लेकिन यह दोनों का उपयोग नहीं करेगा, इसलिए अनावश्यक सूचकांक बनाने की आवश्यकता नहीं है। यह '(सदस्य_आईडी, दोस्त_आईडी) 'पर एक सूचकांक का उपयोग कर सकता है। –

2

मुझे लगता है कि आपको लगता है कि आदेश — में लेकिन प्रश्नों यह overkill और अपने द्वारा पहचानने है के प्रकार के लिए अस्थायी/members (id,lastLogin)— पर एक सूचकांक के साथ filesort से बचने के लिए व्याख्या ऐसा लगता है कि आप पहले से ही की कोशिश की है सक्षम होना चाहिए?

आप इसे profile_friends (member_id,friend_id) पर प्राथमिक/अद्वितीय कुंजी के साथ पूरक बना सकते हैं और देख सकते हैं कि यह कैसे काम करता है।

अंतिम उपाय में, यदि उस क्वेरी इतनी बार और इतने सारे रिकॉर्ड के साथ कि आप सबसे तेजी से होना चाहिए संभव चयन निष्पादित किया जाता है, आप अपनी तालिका denormalize और (member_id,lastLogin) पर एक सूचकांक के साथ profile_friends करने के लिए अपने members.lastLogin स्तंभ की एक प्रति जोड़ सकते हैं। इसके साथ, आप में कोई शामिल नहीं होगा, कोई फाइल नहीं, कुछ भी नहीं। दूसरी तरफ, आपके पास बहुत से दोस्तों के साथ लॉग इन होने पर हर बार बड़ी अद्यतन क्वेरी होगी। फिर, यह उन नंबरों के लिए पूरी तरह से ओवरकिल लगता है जिनके बारे में आप बात कर रहे हैं। mysql में एक बुरा विचार filesort का उपयोग कर,

अस्थायी का उपयोग करना:

मैं लगभग मूल प्रश्न को संबोधित करने के भूल गए?

नहीं, यह नहीं है। यदि आप इसे आसानी से अनुकूलित कर सकते हैं तो आपको हमेशा "फाइलोर्ट-फ्री" प्रश्नों की तलाश करनी चाहिए, लेकिन अन्यथा जब तक कि वे वास्तविक प्रदर्शन समस्या उत्पन्न न करें, आपको इसके बारे में चिंता नहीं करनी चाहिए। Filesort एक क्वेरी के सामान्य निष्पादन का हिस्सा है।

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