আমি দেখার জন্য কার্যকর করার পরিকল্পনা কীভাবে পেতে পারি?


9

আমার বেশ কয়েকটি ভিউ সহ একটি স্কিমা রয়েছে। যথাযথ সূচকগুলি যথাযথভাবে রয়েছে এবং এটি ব্যবহার করা হচ্ছে তা নিশ্চিত করার জন্য আমাকে কার্যকর করার পরিকল্পনাগুলি পরীক্ষা করা দরকার।

আমি এটা কিভাবে করবো?

আমি বরং কপি এবং থেকে আউটপুট পেস্ট করতে হবে না চাই show create view <viewname>মধ্যে explainবিশেষ করে দেখার কিছু অন্যান্য মতামত উপরে নির্মিত হয় এবং এই বেশ ব্যাথা হবে।


1
দ্রষ্টব্য যে বাস্তবায়িত ক্যোয়ারিতে ভিউ ব্যবহার করা হয় তখন কার্যকর করা পরিকল্পনাটি ভিন্ন হতে পারে, কারণ এটি ভিউ থেকে নির্বাচন করা কোয়েরির WHERE এবং অন্যান্য অনুচ্ছেদের উপর নির্ভর করে। যদিও মাইএসকিউএল ভিউগুলি অপ্টিমাইজ করার ক্ষেত্রে মোটামুটি খারাপ তবে এর কিছু অপ্টিমাইজেশন রয়েছে যেখানে পরিস্থিতি উদাহরণস্বরূপ নিচে নামানো হয়।
জেনেস

@ জেনেস ভালো কথা, আমি সেই দিকটি বিবেচনা করি নি। এ থেকে কার্যকর করার পরিকল্পনাটি select * from <view_name>মিলে যাবে তা কি নিরাপদ ?
ম্যাট ফেনউইক

1
হ্যাঁ যতদূর আমি জানি। আপনি যদি ক্ষেত্র 1 = 10 থেকে ফিল্ড 1 এ 10 নির্বাচন করে ফিল্ড 1 এ মাইএসকিএল ব্যবহার করতে চান তবে আপনার ভিউটি সত্যই সরল রাখতে হবে। উদাহরণস্বরূপ কোনও গ্রুপ বা ইউনিয়ন নেই। আমার ধারণা আপনি যে বাস্তবায়ন পরিকল্পনাটির দিকে তাকিয়ে আছেন সেটি সবচেয়ে খারাপ পরিস্থিতি হিসাবে দেখাতে পারে যে এটি কেবলমাত্র মাইএসকিএল ব্যবহারের জন্য একটি অপ্টিমাইজেশন খুঁজে পেলে আরও ভাল হতে পারে।
জেনেস

উত্তর:


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

তথ্য_সেমি.ভিউস সারণীটি ব্যবহার করুন

এটি সমস্ত দর্শনগুলির জন্য ব্যাখ্যাটি উত্পন্ন করবে

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

এটি মাইডিবি ডাটাবেসে সমস্ত দর্শনগুলির জন্য এক্সপ্লেইন উত্পন্ন করবে

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

একবার চেষ্টা করে দেখো !!!

আপডেট 2012-03-22 11:30 ইডিটি

@ ম্যাটফেনউইক, আপনার উত্তরটি আমার চেয়ে সম্পূর্ণ সহজ। এখানে মাইএসকিউএল 5.5.12 চালিয়ে আমার পিসিতে চেষ্টা করার একটি উদাহরণ এখানে দেওয়া হয়েছে। আমি আপনার উত্তর থেকে নির্বাচিত সংস্করণ এবং আমার উত্তর থেকে উত্পন্ন উত্সর্গাদনের উভয় বিষয়েই দৌড়েছি:

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 -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

এটি মাইডিবি ডাটাবেসে সমস্ত দর্শনগুলির জন্য এক্সপ্লেইন উত্পন্ন করবে

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!
ম্যাট ফেনউইক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.