মাইএসকিউএল সূচক ভারচর


10

আমি আরও blogentriesভাল পারফরম্যান্সের জন্য আমার ডাটাবেস সূচী করার চেষ্টা করছি কিন্তু একটি সমস্যা পেয়েছি found

এখানে কাঠামোটি রয়েছে:

CREATE TABLE IF NOT EXISTS `blogentries` (
  `id_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `title_id` varchar(100) COLLATE latin1_german2_ci NOT NULL,
  `entry_id` varchar(5000) COLLATE latin1_german2_ci NOT NULL,
  `date_id` int(11) NOT NULL,
  PRIMARY KEY (`id_id`)
)
ENGINE=MyISAM
DEFAULT CHARSET=latin1
COLLATE=latin1_german2_ci
AUTO_INCREMENT=271;

নিম্নলিখিত মত একটি কোয়েরি সূচক সঠিকভাবে ব্যবহার করে:

EXPLAIN SELECT id_id,title_id FROM blogentries ORDER by id_id DESC
+ + ---- + + ------------- + + ------------- + + ------- + + -------- ------- + + --------- + + --------- + + ------ + + ------ + + -------- ----- + +
| আইডি | নির্বাচন_প্রকার | টেবিল | প্রকার | সম্ভব_কিজ | কী | key_len | রেফ | সারি | অতিরিক্ত |
+ + ---- + + ------------- + + ------------- + + ------- + + -------- ------- + + --------- + + --------- + + ------ + + ------ + + -------- ----- + +
| 1 | সরল | ব্লজেন্টারি | সূচী | নুল | প্রাথমিক | 114 | নুল | 126 | সূচকের ব্যবহার |
+ + ---- + + ------------- + + ------------- + + ------- + + -------- ------- + + --------- + + --------- + + ------ + + ------ + + -------- ----- + +

যাইহোক, যখন আমি যোগ entry_idমধ্যে SELECTক্যোয়ারী এটা filesort ব্যবহার

EXPLAIN SELECT id_id,title_id,entry_id FROM blogentries ORDER by id_id DESC
+ + ---- + + ------------- + + ------------- + + ------ + + --------- ------ + + ------ + + --------- + + ------ + + ------ + + ------------ ---- + +
| আইডি | নির্বাচন_প্রকার | টেবিল | প্রকার | সম্ভব_কিজ | কী | key_len | রেফ | সারি | অতিরিক্ত |
+ + ---- + + ------------- + + ------------- + + ------ + + --------- ------ + + ------ + + --------- + + ------ + + ------ + + ------------ ---- + +
| 1 | সরল | ব্লজেন্টারি | সব | নুল | নুল | নুল | নুল | 126 | ফাইলসোর্ট ব্যবহার |
+ + ---- + + ------------- + + ------------- + + ------ + + --------- ------ + + ------ + + --------- + + ------ + + ------ + + ------------ ---- + +

আমি ভাবছিলাম কেন এটি হচ্ছে এবং আমি কীভাবে এড়াতে পারি? এটি কি কারণে VarCharএবং এটি অন্য কোনও কিছুর মধ্যে পরিবর্তন করা উচিত?

আমি আমার সমস্ত প্রশ্নের সূচকটি ব্যবহার করার চেষ্টা করছি কারণ আমি উচ্চ Handler_read_rndএবং Handler_read_rnd_nextমানগুলিতে চলে আসছি ।

আপনার যদি অন্য কোনও তথ্যের প্রয়োজন হয় তবে আমি এটি পোস্টও করতে পারি।


ফাইলসোর্ট মানে এটি ডিস্কে বাছাই করে।
কেরমিট

WHERE 1=1আপনার দ্বিতীয় ক্যোয়ারিতে যুক্ত করার চেষ্টা করুন ।
কেরমিট

এটি মাইএসকিউএল এর কোন সংস্করণ? আপনার বাছাই বাফার আকারটি ( SELECT @@sort_buffer_size) কত?

@njk ফাইলসোর্ট অনুসন্ধানের 'অর্ডার দ্বারা' অংশের ফলাফল

1
@ তাশপেমিভা অগত্যা নয়, প্রথম বিবৃতি দেখুন।
কেরমিট

উত্তর:


6

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


অবশ্যই মাইএসকিউএল এর জন্য সূচক ব্যবহার করা উচিত ORDER BY?
উদয়জাল

@ ইজগিয়াল স্মৃতিশক্তি জন্য খুব বড় যদি না।
কেরমিট

@ এনজেকি: এটির কোনও অর্থ নেই ... পুরো জিনিসটিকে মেমোরিতে লোড করার প্রয়োজন ছাড়াই এটি সূচকটি অতিক্রম করতে পারে। ফাইলসোর্ট সম্পাদন করার প্রয়োজন ছাড়াই ফলাফলগুলি বাছাই করা হবে।
উদয়জাল

@ ইগজিয়াল আমি আকারটি নিয়ে প্রশ্ন করব varchar(5000)
কেরমিট

@ এনজেকি: তবে সেই কলামটি সূচীতে নেই বা সাজানোর ক্ষেত্রেও ব্যবহৃত হচ্ছে না।
উদয়জাল

2

ORDER BYঅপ্টিমাইজেশনের অধীনে নথিভুক্ত হিসাবে :

ধীরে ধীরে অনুসন্ধানের জন্য যার filesortজন্য ব্যবহৃত হয় না, max_length_for_sort_dataএকটি মানকে কমিয়ে চেষ্টা করুন যা এটিকে ট্রিগার করতে উপযুক্ত filesort

তাঁর ব্লগ নিবন্ধে পঠিত_আরন্দ_ফুফার_সাইজটি ঠিক কী , পিটার জাইতসেভ ব্যাখ্যা করেছেন:

আমার জন্য এর অর্থ মাইএসকিউএল ৪.১ যেহেতু এই বিকল্পটি কেসগুলির সংকীর্ণ পরিসরে ব্যবহৃত হয় - আপনি যদি কয়েকটি ক্ষেত্র পুনরুদ্ধার করেন (সর্বাধিক দৈর্ঘ্যের_সোর্ট_ডাটার চেয়ে কম ) ডেটা বাছাই করা বাফার এবং বাছাই করা ফাইলের মধ্যে সংরক্ষণ করা উচিত যাতে নির্বাচিত কলামগুলি পড়ার দরকার নেই লম্বা তাই তারা সর্বোচ্চ_ দৈর্ঘ্যের_সোর্দ_ডাটার চেয়ে লম্বা এটির প্রায়শই অর্থ হবে এর মধ্যে কিছু পাঠ্য / বিএলওবি কলাম রয়েছে। তবে এটি ব্যবহৃত হবে যদি এখানে প্রচুর সংখ্যক কলাম থাকে বা লম্বা VARCHAR কলাম ব্যবহৃত হয় - এটি স্থির উপস্থাপনায় সর্বোচ্চ_ দৈর্ঘ্য_সোর্দ_ডাতার চেয়ে দীর্ঘতর একটি সারি তৈরি করতে কেবলমাত্র ইউটিএফ 8 ভর্চার (255) লাগে ।

এটি সুপারিশ করে যে max_length_for_sort_dataএকটি নির্বাচন করছে যে কলামগুলির মোট আকারের একটি সীমা, তার উপরে filesortএকটি সূচক ভিত্তিক সাজানোর পরিবর্তে ব্যবহৃত হবে।

আপনার ক্ষেত্রে, entry_id(5002 বাইট) নির্বাচন করা এই ভেরিয়েবলের 1KiB ডিফল্ট মানের চেয়ে মোট আকার নেয় এবং তাই filesortএটি ব্যবহৃত হয়। 8KiB সীমা বাড়াতে, আপনি এটি করতে পারেন:

SET SESSION max_length_for_sort_data = 8192;

আমার এটির সাথে খুব অনুরূপ সেটআপ সহ একটি টেবিল রয়েছে এবং এই সেটিংটি ফাইলসোর্ট ব্যবহারের কোনও পরিবর্তনকে ট্রিগার করে না বলে মনে হয়।

@ মুফিনিস্তা: এটি আকর্ষণীয়। আমি মনে করি এটি @ রোল্যান্ডোমাইএসকিউএলডিবিএর উত্তর অনুসারে অন্য কিছু বাফার সেটিংসের সাথে সম্পর্কিত হতে পারে ?
উদয়জাল

2

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

আরও দেখুন: মাইএসকিউএল ক্যোয়ারী অনুকূলিতকরণের জন্য 10 টি টিপস (এটি স্তন্যপান করে না)

সুতরাং, যদি এন্ট্রি_আইডিতে একটি সূচক থাকতে পারে, তবে আপনি এটি যুক্ত করতে এবং প্রস্তুত হতে পারেন। তবে আমি সন্দেহ করি যে এটি একটি বিকল্প, তাই করণীয় কী?

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

অন্যদিকে, যদি এই টেবিলটিতে এক মিলিয়ন সারি থাকে, আপনার সমস্যা হতে পারে। আপনার যদি এই টেবিলটিতে প্রশ্নের পৃষ্ঠাগুলি সমর্থন করার প্রয়োজন হয় তবে আপনার এখানে সত্যিই গুরুতর পারফরম্যান্স সমস্যা হতে পারে। সেক্ষেত্রে আপনার পরিবর্তনশীল দৈর্ঘ্যের ডেটাটিকে একটি নতুন টেবিলের মধ্যে বিভাজন করা এবং এটি পুনরুদ্ধার করার জন্য একটি JOIN করা বিবেচনা করার জন্য একটি বৈধ অপ্টিমাইজেশন।

এখানে এসও সম্পর্কিত আরও কয়েকটি উত্তর রয়েছে যা এই প্রশ্নের চারপাশে কথা বলে:


ওপির প্রথম ক্যোয়ারিতে " মাইএসকিউএল এ চলক দৈর্ঘ্যের ডেটা রয়েছে এবং অনুরোধকৃত কলামগুলির সাথে সমস্ত মিল নেই এমন কোনও সূচক নেই ", তবুও filesortসম্ভবত সেই ক্ষেত্রে ব্যবহার করা হয়নি । আমি আরও মনে করি যে এমনকি মেমরিতে একটি ছোট টেবিল বাছাই করা একটি অগ্রহণযোগ্য পারফরম্যান্স হিট হিসাবে প্রমাণিত হতে পারে: উদাহরণস্বরূপ যদি কোয়েরিটি অনেক সম্পাদন করা হয় (এবং টেবিলটি পরিবর্তিত হয় যাতে ক্যাশেগুলি ব্যবহার করা যায় না)।
উদয়জাল

এটি পরীক্ষা করার মতো সময় আমার কাছে নেই, তবে আমি ভাবছিলাম যে এটি কোনও V মার্চআরএআর করে ট্রিগার করা হয়েছে কিনা যার জন্য ডেভ.মাইএসকিএল.ডোক / রেফম্যান / ৫.১/en/char- এ উল্লিখিত দৈর্ঘ্য সংরক্ষণের জন্য 2 বাইট প্রয়োজন । এইচটিএমএল - সুতরাং প্রথম ক্যোয়ারীটি সেই সীমাটির মধ্যে ফিট করে তবে দ্বিতীয়টি তা পায় না।

0

WHEREআপনার প্রশ্নের মধ্যে একটি ধারা যোগ করার চেষ্টা করুন ।

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

http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html


কিন্তু এই ক্ষেত্রে ORDER BY নয় ঠিক সূচক মেলে, তাই একটি আছে কোন প্রয়োজন নেই WHEREদফা।
উদয়জাল

সাইটে সত্যিকারের ক্যোয়ারিতে আমার একটি "যেখানে" ধারা রয়েছে, তাই আমি জানি ফাইলটি বাছাইয়ের কারণ নয়। আমি ভাবছি এটি কি ভারচরের ব্যবহার?

0

আমার জ্ঞানের পরিধিটি কেবল মাত্র সর্বোচ্চ 8000 বাইট ধারণ করতে পারে যা প্রায় 4000 অক্ষর। সুতরাং, 5000 স্টোরেজ সীমা ছাড়িয়ে গেছে বলে মনে হচ্ছে, এবং এই ক্ষেত্রে সম্ভবত কারণ বাছাই করা বিশৃঙ্খলা হতে চলেছে।

"ভারচার [(এন | সর্বোচ্চ)] চলক দৈর্ঘ্য, অ-ইউনিকোড অক্ষর ডেটা n এন 1 থেকে 8,000 এর মধ্যে একটি মান হতে পারে indicates ডেটা দৈর্ঘ্য + 2 বাইট প্রবেশ করানো হয়েছে entered প্রবেশ করা তথ্য দৈর্ঘ্যে 0 টি অক্ষর হতে পারে var

আশা করি এটি আপনার প্রশ্নের উত্তর দেয়


দ্য CHARএবং VARCHARটাইপগুলির অধীনে নথিভুক্ত হিসাবে : " ভ্রচার কলামের মানগুলি পরিবর্তনশীল-দৈর্ঘ্যের স্ট্রিং My VARCHARমাইএসকিউএল 5.0.3 এ এর সর্বোচ্চ দৈর্ঘ্য এবং পরে সর্বাধিক সারি আকারের (65,535 বাইট, যা সমস্ত কলামের মধ্যে ভাগ করা হয়) এবং ব্যবহৃত অক্ষর সেট
সাপেক্ষে

0

আপনার টেবিলে আপনার কেবল 126 টি সারি রয়েছে। এমনকি যদি প্রতিটি সারির সর্বাধিক 5KB আকার হয় তবে এর অর্থ হ'ল ডিস্ক থেকে পড়ার জন্য মোট আকারটি প্রায় 600KB - এটি পুরোপুরি খুব বেশি নয়। প্রকৃতপক্ষে, এটি খুব সামান্য পরিমাণ, বেশিরভাগ আধুনিক ডিস্ক ড্রাইভের ক্যাশে আকারের চেয়ে কম।

এখন, যদি সার্ভারের আপনার ক্যোয়ারীটি পূরণের জন্য আপনার ডেটা পুনরুদ্ধার করা দরকার, তবে সবচেয়ে ব্যয়বহুল ক্রিয়াকলাপটি এটি ডিস্ক থেকে পড়া। তবে, সূচীর আদেশ অনুযায়ী এটি পড়া সর্বদা দ্রুত করার উপায় নয়, বিশেষত যখন ডেটার পরিমাণ এত কম থাকে।

আপনার ক্ষেত্রে, ডিস্ক থেকে পুরো টেবিলের ডেটা মেমরির একক ব্লক হিসাবে সম্ভবত পড়ার পক্ষে (সম্ভবত কেবলমাত্র একটি ডিস্ক রিড অপারেশন বা সন্ধান করতে হবে), এবং তারপরে অর্ডারটি সন্তুষ্ট করতে এটি র‌্যামে সাজান যা ডিস্কের তুলনায় তাত্ক্ষণিক is অপারেশন পড়ুন। যদি সার্ভার সূচক অনুসারে আপনার ডেটা পড়ে, তবে এটি 126 (ওফ!) রিড অপারেশনগুলি প্রকাশ করতে হবে, বহুবার একই ডেটা ফাইলে পিছনে পিছনে সন্ধান করে।

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

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


দেখে মনে হচ্ছে আপনি সম্পূর্ণ টেবিল স্ক্যানগুলি কীভাবে এড়িয়ে চলবেন সেগুলি থেকে বেশ কিছু জিনিস গণ্ডগোল করছেন , যা ধারাগুলি নয়, সন্তোষজনক JOINশর্ত এবং WHEREধারাগুলিতে সূচক ব্যবহারের সাথে করা ORDER BY
অজগাল

একেবারে বিপরীত। এই বিশেষ ক্ষেত্রে পূর্ণ টেবিল স্ক্যানটি খুব ভাল জিনিস কারণ এটি সূচী ক্রম দ্বারা পড়া চেয়ে দ্রুত।

0

আপনি মাইএসকিউএল এর কোন সংস্করণ ব্যবহার করছেন?

5.1-এ, আমি আপনার দৃশ্যের সেটআপ করার চেষ্টা করেছি এবং কিছু ডামি ডেটা তৈরি করেছি। আপনার সরবরাহিত এসকিউএলগুলি ব্যবহার করে, আমি কেবল বর্ণিত অনুসারে প্রতিবার একটি টেবিল স্ক্যান পাই। ডিফল্ট দ্বারা আপনি যখন এমওয়াইএসকিউএল দ্বারা অর্ডার ব্যবহার করেন তখন ফাইলআর্টে রিসর্টগুলি এমনকি প্রাথমিক সূচকটি যদি ক্রমে ব্যবহৃত হয়।

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