2010-05-03 12 views
18

मेरे पास इसमें लगभग 100,000 उपयोगकर्ताओं के लिए एक टेबल है।MySQL दृश्य प्रदर्शन

पहले मामला:

Create or replace view vw_users as select state, count(*) as cnt from users 

Explain select cnt from vw_users where state = 'ca' 

जब मैं एक योजना की व्याख्या करते हैं:

explain select state, count(*) as cnt from users where state = 'ca' 

जब मैं एक ऊपर क्वेरी मैं 5200

दूसरे मामले के रूप में लागत पाने के लिए योजना की व्याख्या कैसे करते दूसरी पूछताछ पर मुझे 100,000 की लागत मिलती है।

दृश्य में कहां क्लॉज काम करता है? क्या दृश्य के बाद लागू किया गया खंड सभी पंक्तियों को पुनर्प्राप्त करता है? मैं यह समस्या कैसे हल करूं?

+2

आपके व्यू परिभाषा याद आ रही है खंड द्वारा समूह। –

+0

यदि आप मर्ज एल्गोरिदम का उपयोग नहीं कर सकते हैं, तो यहां एक काम है जो मुझे उपयोगी पाया गया है: [आकर्षक विचारों की प्रदर्शन समस्याओं के लिए वर्कअराउंड] (http://www.mysqlperformanceblog.com/2010/05/19/a-workaround- निष्पादन योग्य विचारों के लिए-प्रदर्शन-समस्याओं /) – landoncz

उत्तर

28

यह लगभग view algorithm है जिसका उपयोग किया गया है।

मर्ज एल्गोरिथ्म काम करता है अच्छी तरह से सबसे तालिका अनुक्रमित और whatnot - temptable एल्गोरिथ्म नहीं करता है - कई मामलों में अपने अनुक्रमित सिर्फ खुले दिल से सब पर उपयोग नहीं किया जाएगा।

और वहाँ विलय उस दृश्य निम्नलिखित निर्माणों में से किसी में शामिल है, तो नहीं किया जा सकता का समर्थन नहीं करता

मर्ज बकवास के बहुत सारे है:

* Aggregate functions (SUM(), MIN(), MAX(), COUNT(), and so forth) 
* DISTINCT 
* GROUP BY 
* HAVING 
* LIMIT 
* UNION or UNION ALL 
* Subquery in the select list 
* Refers only to literal values (in this case, there is no underlying table) 
+0

पीटर, इनपुट के लिए धन्यवाद। मेरे पास मेरे विचार में एक गिनती है (*)। तो मैं विलय का उपयोग नहीं कर सकता। अभी मैंने कोई एल्गोरिदम प्रकार निर्दिष्ट नहीं किया है। तो सबसे अच्छा तरीका किसी दृश्य के बजाय संग्रहीत प्रक्रिया का उपयोग किया जा सकता है? – vamsivanka

+0

हाँ, आपको यहां संग्रहीत प्रक्रिया के लिए जाना होगा - या केवल एक सीधी-अप सबक्वायरी। –

+0

पीटर, बहुत बहुत धन्यवाद। – vamsivanka

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