মাইএসকিউএল ক্যোয়ারী অপটিমাইজার কোথা থেকে সূচকের পরিসংখ্যানগুলি পড়ে?


14

আমি নির্ধারণের চেষ্টা করছি যে মাইএসকিউএল অপ্টিমাইজার যখন কোনও টেবিলের জন্য উপলব্ধ সূচিগুলির তালিকা প্রাপ্ত করে তখন এটি কোয়ের থেকে (প্রস্তুতির) ব্যয় নির্ধারণ করে।


এই ভাল প্রশ্নের জন্য +1 কারণ বিকাশকারী এবং ডিবিএগুলিকে সূচিপত্রের পরিসংখ্যান কীভাবে সংকলন এবং সংরক্ষণ করা হয় সে সম্পর্কে বিরতি দেওয়া উচিত।
রোল্যান্ডোমাইএসকিউএলডিবিএ

<: রেফারেন্স, মাইএসকিউএল ডকুমেন্টেশন ওয়েবসাইট থেকে জন্য dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html >> ANALYZE TABLEনির্ধারণ সূচক cardinality (এর Cardinality কলামে প্রদর্শিত হিসাবে SHOW INDEXআউটপুট) প্রতিটি আট র্যান্ডম ধনী করে সূচক গাছগুলির এবং তদনুযায়ী সূচক কার্ডিনালিটির আনুমানিক আপডেট। এগুলি কেবলমাত্র অনুমান হিসাবে, অ্যানালাইজ টেবিলের বারবার রানগুলি বিভিন্ন সংখ্যা তৈরি করতে পারে। এটি ANALYZE TABLEInnoDB টেবিলগুলিতে দ্রুত তৈরি করে তবে 100% নির্ভুল নয় কারণ এটি সমস্ত সারি অ্যাকাউন্টে নেয় না।
চেন Xie

উত্তর:


6

এর সরাসরি উত্তর হবে

information_schema.statistics

mysql> desc information_schema.statistics;
+---------------+---------------+------+-----+---------+-------+
| Field         | Type          | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+-------+
| TABLE_CATALOG | varchar(512)  | NO   |     |         |       |
| TABLE_SCHEMA  | varchar(64)   | NO   |     |         |       |
| TABLE_NAME    | varchar(64)   | NO   |     |         |       |
| NON_UNIQUE    | bigint(1)     | NO   |     | 0       |       |
| INDEX_SCHEMA  | varchar(64)   | NO   |     |         |       |
| INDEX_NAME    | varchar(64)   | NO   |     |         |       |
| SEQ_IN_INDEX  | bigint(2)     | NO   |     | 0       |       |
| COLUMN_NAME   | varchar(64)   | NO   |     |         |       |
| COLLATION     | varchar(1)    | YES  |     | NULL    |       |
| CARDINALITY   | bigint(21)    | YES  |     | NULL    |       |
| SUB_PART      | bigint(3)     | YES  |     | NULL    |       |
| PACKED        | varchar(10)   | YES  |     | NULL    |       |
| NULLABLE      | varchar(3)    | NO   |     |         |       |
| INDEX_TYPE    | varchar(16)   | NO   |     |         |       |
| COMMENT       | varchar(16)   | YES  |     | NULL    |       |
| INDEX_COMMENT | varchar(1024) | NO   |     |         |       |
+---------------+---------------+------+-----+---------+-------+
16 rows in set (0.01 sec)

আপনি এই টেবিলটি দিয়ে নির্বাচন করতে পারেন

SELECT * FROM information_schema.statistics
WHERE table_schema='mydb' AND table_name='mytable';

বা করে পরিসংখ্যান দেখুন

Mydb.mytable থেকে সূচকগুলি দেখান;

দয়া করে মনে রাখবেন যে এই টেবিলটি লিখিত-ভারী পরিবেশে সর্বদা নির্ভুল হয় না। পর্যায়ক্রমে আপনি চালাতে হবে সারণী বিশ্লেষণ সব MyISAM টেবিল যে ঘন ঘন আপডেট করা হয় বিরুদ্ধে। অন্যথায়, মাইএসকিউএল ক্যোয়ারী অপটিমাইজার, যা তথ্য_সেমি.স্ট্যাটিস্টিক্সের উপর নির্ভর করে, কখনও কখনও অনুসন্ধানগুলির জন্য এক্সপ্ল্যান পরিকল্পনা তৈরি করার সময় খারাপ পছন্দ করতে পারে sometimes সূচকের পরিসংখ্যানগুলি যথাসম্ভব আপ-টু-ডেট হতে হবে।

আনালাইজ সারণিতে ইনোডিবি টেবিলগুলির বিপরীতে নিখরচায় কোনও প্রভাব নেই। InnoDB- র জন্য সমস্ত সূচকের পরিসংখ্যান বিটিআরই পৃষ্ঠায় ডাইভের মাধ্যমে চাহিদা অনুযায়ী গণনা করা হয়। অতএব, আপনি যখন কোনও ইনোডিবি টেবিলের বিপরীতে শো সূচকগুলি চালান, তখন প্রদর্শিত কার্ডিনালিটিগুলি সর্বদা আনুমানিক হয়।

আপডেট ২০১১-০6-২১ 12:17 ইডিটি

আনলাইজ টেবিলের স্পষ্টতার জন্য, আমাকে পুনরায় চাপ দিন let ইনোডিবি টেবিলগুলিতে অ্যানালাইজ ট্যাবলেট চালানো সম্পূর্ণ অকেজো। এমনকি আপনি যদি কোনও ইনোডিবি টেবিলে আনলাইজে টেবিলে দৌড়ান, তবুও ইনোডিবি স্টোরেজ ইঞ্জিন কার্ডিনালিটির আনুষঙ্গিকতার জন্য সূচকটিতে বারবার ডাইভগুলি সম্পাদন করে, এভাবে আপনি কেবল সংকলিত পরিসংখ্যানকে ট্র্যাশ করে । আসলে, পারকোনা অ্যানালাইজ টেবিলে কিছু পরীক্ষা করেছে এবং সেই সিদ্ধান্তেও পৌঁছেছে।


5

পুনরায়: আনালাইজ টেবিলে ইনোডিবি টেবিলগুলির বিপরীতে নিখরচায় কোনও প্রভাব নেই।

আমি এই বিবৃতিটি সত্য কিনা তা নিশ্চিত নই। আমরা ইন্নাডব টেবিলগুলি ভারীভাবে পড়ছি এবং লিখছি এবং যখন মাইএসকিএল অপ্টিমাইজারটি খারাপ পছন্দ করে, তখন ক্যোয়ারীর ব্যাখ্যা আউটপুটটি খারাপ কৌশল দেখায়। এবং একটি ইনোডব টেবিলের সূচকগুলিও দেখান তাদের কার্ডিনালটির মানগুলিতে এত বেশি বৈচিত্র। কিন্তু সেই ইনোডাব টেবিলগুলিতে একটি আনালাইজ কমান্ড চালানো ব্যাখ্যা পরিকল্পনার সংশোধন করে এবং কার্ডিনালটির বৈচিত্র্য আচরণকে সরিয়ে দেয়। আমি জানি না যে ইনোডাব টেবিলগুলিতে আনালাইজে টেবিল কমান্ডটি সর্বদা সহায়তা করে কিনা তবে আমাদের ক্ষেত্রে এটি প্রায় 99% সময়কে সহায়তা করেছিল।

আমরা আমাদের প্রশ্নের মধ্যে "STRAIGHT_JOIN" অন্তর্ভুক্ত করে মাইএসকিএল অপ্টিমাইজারের খারাপ পছন্দটিকে পুরোপুরি দূর করেছি। এই মাইএসকিএল অপ্টিমাইজারটি খারাপ পছন্দ বা কোনও পছন্দ না করে কেবল ক্যোয়ারীতে আমরা যেমন সংজ্ঞায়িত করেছি তার জিন শর্ত অনুসরণ করতে বাধ্য করে।


InnoDB টেবিলগুলিতে অ্যানালাইজ ট্যাবলেটের অনর্থকটি হাইলাইট করার জন্য আমি আমার উত্তর আপডেট করেছি।
রোল্যান্ডোমাইএসকিউএলডিবিএ

যখন আপনি কার্ডিনালিটির বিভিন্নতার কথা উল্লেখ করেছেন তখন আমি আপনার উত্তরের সাথে সম্মত। কার্ডিনালিটির আনুমানিকতা বলতে গিয়ে আমি ঠিক তাই বলছিলাম।
রোল্যান্ডোমাইএসকিউএলডিবিএ

আমার আরও উল্লেখ করার দরকার ছিল যে মাইএসকিউএল ক্যোরি অপটিমাইজার মাঝে মাঝে এগুলি মুছে ফেলার জন্য কোয়েরিতে ইঙ্গিতগুলি ব্যবহার করা সর্বদা সবচেয়ে ভাল কাজ নয়। কোয়েরি পরিকল্পনার অংশগুলিতে
RolandoMySQLDBA

2

মাইস্যামের জন্য অ্যানালাইজ টেবিলটি পুরো টেবিলটি স্ক্যান করে এবং পরিসংখ্যানগুলি পুনর্নির্মাণ করে, যা .MYI ফাইলে সংরক্ষণ করা হয়েছে (আমার মনে হয়)। এটি খুব কমই প্রয়োজন হয়।

InnoDB এর জন্য অ্যানালাইজ টেবিলটি কিছু করে - এটি উল্লিখিত ডাইভটি করে । সমস্যাটি হ'ল এটি সহায়তা করতে পারে, জিনিসগুলিকে আরও খারাপ করতে পারে বা (সম্ভবত:) কোনও দৃশ্যমান পার্থক্য তৈরি করতে পারে না (কার্ডিনালিটিগুলি ব্যতীত)।

নতুন সংস্করণগুলি 8 টি-তেমন-এলোমেলো প্রোবগুলিকে (1) আরও এলোমেলো করে পরিবর্তিত করার অনুমতি দেবে বলে প্রতিশ্রুতি দেয়, (২) আপনাকে "8" পরিবর্তন করতে দেয় (এর পক্ষে বিভিন্ন দিক রয়েছে)!

নীচের লাইন: InnoDB এখনও এটি 'ডান' পায়নি। যখন আপনার মনে হয় এটি বিশ্লেষণ করুন তবে শ্বাস ফেলাবেন না।

হালনাগাদ

পুনরায় বাক্য বলতে ... InnoDB টেবিলগুলির অপ্টিমাইজেশানের উপর ANALYZE TABLEএকটি অস্থায়ী প্রভাব রয়েছে (সম্ভবত উপকারী, সম্ভবত নয়)।

"নতুন সংস্করণ": 5.6.6 (2012) এবং মারিয়াডিবি 10.1 (2014) দিয়ে শুরু করে, পরিসংখ্যানগুলি আরও ভাল পরিচালনা করা হয় এবং ANALYZEএখন (1) কম প্রায়ই প্রয়োজন হয়, এবং (2) আরও স্থায়ী।

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