मैं एक दृश्य के लिए निष्पादन योजना कैसे प्राप्त कर सकता हूं?


9

मेरे पास कई विचारों के साथ एक स्कीमा है। मुझे यह सुनिश्चित करने के लिए निष्पादन योजनाओं की जांच करने की आवश्यकता है कि उपयुक्त सूचकांक जगह में हैं और उनका उपयोग किया जा रहा है।

मैं यह कैसे करु?

मैं नहीं बल्कि कॉपी और से उत्पादन पेस्ट करने की जरूरत नहीं होगी show create view <viewname>में explainविशेष रूप से के रूप में देखा गया के कुछ अन्य विचारों के शीर्ष पर बनाया जाता है और यह काफी दर्द हो सकता है,।


1
ध्यान दें कि जब वास्तविक दृश्य प्रश्नों में VIEW का उपयोग किया जाता है, तो निष्पादन योजना अलग हो सकती है, क्योंकि यह VIEW से चयन करने वाली क्वेरी में WHERE और अन्य खंडों पर निर्भर करता है। हालांकि MySQL VIEWs के अनुकूलन में काफी खराब है, लेकिन इसमें कुछ अनुकूलन हैं जहां स्थितियों को उदाहरण के लिए नीचे धकेल दिया जाता है।
Jannes

@ अच्छे बिंदु, मैंने उस पहलू पर विचार नहीं किया। क्या यह मान लेना सुरक्षित है कि इससे निष्पादन योजना select * from <view_name>मेल खाएगी?
मैट फेनविक

1
हाँ जहाँ तक मुझे पता है। यदि आप चाहते हैं कि mysql फील्ड 1 पर एक इंडेक्स का चयन करें * से <view-name> जहां field1 = 10 का उपयोग करें तो आपको वास्तव में सरल रखना होगा। उदाहरण के लिए कोई ग्रुप BY या UNION नहीं। मुझे लगता है कि आप कह सकते हैं कि जिस निष्पादन योजना को आप देख रहे हैं वह सबसे खराब स्थिति की तरह है, यह केवल तभी बेहतर हो सकता है जब mysql उपयोग करने के लिए एक अनुकूलन पाता है।
Jannes

जवाबों:


7

यह मैंने पहली बार कोशिश की है:

mysql> explain view_name;
+---------+------------+------+-----+---------+-------+
| Field   | Type       | Null | Key | Default | Extra |
+---------+------------+------+-----+---------+-------+
| field1  | varchar(3) | YES  |     | NULL    |       |
| field2  | varchar(3) | YES  |     | NULL    |       |
| field3  | bigint(21) | NO   |     | 0       |       |
| field4  | bigint(21) | NO   |     | 0       |       |
+---------+------------+------+-----+---------+-------+

जाहिर है कि यह काम नहीं करता है - यह करने जैसा ही है describe view_name

हालांकि, select * from view_nameकाम करने लगता है:

mysql> explain select * from view_name;
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+
| id | select_type | table      | type | possible_keys | key  | key_len | ref  | rows | Extra                           |
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+
|  1 | PRIMARY     | <derived5> | ALL  | NULL          | NULL | NULL    | NULL |   18 |                                 |
|  1 | PRIMARY     | <derived3> | ALL  | NULL          | NULL | NULL    | NULL |  105 | Using where; Using join buffer  |
|  5 | DERIVED     | <derived6> | ALL  | NULL          | NULL | NULL    | NULL |   68 | Using temporary; Using filesort |
|  6 | DERIVED     | basetable  | ALL  | NULL          | NULL | NULL    | NULL |  928 | Using temporary; Using filesort |
|  3 | DERIVED     | <derived4> | ALL  | NULL          | NULL | NULL    | NULL |  386 | Using temporary; Using filesort |
|  4 | DERIVED     | basetable  | ALL  | NULL          | NULL | NULL    | NULL |  928 | Using temporary; Using filesort |
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+

एक स्पष्ट, सरल उत्तर के लिए +1। मैंने आपका जवाब आपके आधार पर समायोजित किया। आपको इस पर अपना उत्तर स्वीकार करना चाहिए।
रोलैंडमाइसीडीडीबीए

7

का प्रयोग करें information_schema.views तालिका

यह सभी विचारों के लिए EXPLAIN उत्पन्न करेगा

mysql -uroot -p -AN -e"select concat('explain ',view_definition) from information_schema.views" > /root/ExplainViews.sql

यह mydb डेटाबेस में सभी दृश्यों के लिए EXPLAIN उत्पन्न करेगा

mysql -uroot -p -AN -e"select concat('explain ',view_definition) from information_schema.views where table_schema = 'mydb'" > /root/ExplainViews.sql

कोशिश करो !!!

UPDATE 2012-03-22 11:30 EDT

@MattFenwick, आपका जवाब मेरी तुलना में बहुत आसान है। यहाँ एक उदाहरण है जिसे मैंने अपने पीसी पर MySQL 5.5.12 चलाने की कोशिश की। मैंने आपके उत्तर से चयनित संस्करण दोनों पर और मेरे उत्तर से उत्पन्न EXPLAIN को छोड़ दिया:

mysql> explain select * from bigjoin;
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+-------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref           | rows | Extra       |
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+-------------+
|  1 | SIMPLE      | k     | index  | NULL          | PRIMARY | 4       | NULL          |   14 | Using index |
|  1 | SIMPLE      | a     | eq_ref | PRIMARY       | PRIMARY | 4       | test.k.id_key |    1 | Using index |
|  1 | SIMPLE      | b     | ALL    | NULL          | NULL    | NULL    | NULL          |    4 |             |
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+-------------+
3 rows in set (0.00 sec)

mysql> explain select `a`.`id_key` AS `id_key1`,`b`.`id_key` AS `id_key2` from ((`test`.`idlist` `k` left join `test`.`id_key_table` `a` on((`k`.`id_key` = `a`.`id_key`))) left join `test`.`new_keys_to_load` `b` on((`k`.`id_key` = `b`.`id_key`)));
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+-------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref           | rows | Extra       |
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+-------------+
|  1 | SIMPLE      | k     | index  | NULL          | PRIMARY | 4       | NULL          |   14 | Using index |
|  1 | SIMPLE      | a     | eq_ref | PRIMARY       | PRIMARY | 4       | test.k.id_key |    1 | Using index |
|  1 | SIMPLE      | b     | ALL    | NULL          | NULL    | NULL    | NULL          |    4 |             |
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+-------------+
3 rows in set (0.00 sec)

mysql>

वे दोनों एक ही योजना का उत्पादन किया। मैं आपके तरीके को लागू करने के लिए अपना जवाब बदल दूंगा। आपको मुझसे एक +1 मिलता है, हालांकि यह सरलता के लिए +2 है। आपको आगे बढ़ना चाहिए और इस पर अपना जवाब स्वीकार करना चाहिए।

यहाँ MySQL में VIEW के बारे में एक रोचक तथ्य है: एक दृश्य में दो स्थानों का प्रतिनिधित्व किया गया है information_schema डेटाबेस

यह सभी विचारों के लिए EXPLAIN उत्पन्न करेगा

mysql -uroot -p -AN -e"select concat('explain select * from ',table_schema,'.',table_name,';') from information_schema.tables WHERE engine IS NULL" > /root/ExplainViews.sql

या

mysql -uroot -p -AN -e"select concat('explain select * from ',table_schema,'.',table_name,';') from information_schema.views" > /root/ExplainViews.sql

यह mydb डेटाबेस में सभी दृश्यों के लिए EXPLAIN उत्पन्न करेगा

mysql -uroot -p -AN -e"select concat('explain select * from ',table_schema,'.',table_name,';') from information_schema.tables WHERE table_schema='mydb' AND engine IS NULL;" > /root/ExplainViews.sql

या

mysql -uroot -p -AN -e"select concat('explain select * from ',table_schema,'.',table_name,';') from information_schema.views WHERE table_schema='mydb';" > /root/ExplainViews.sql

+1 यह दिखाने के लिए कि निष्पादन योजना दोनों ही तरह से है!
मैट फेनविक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.