ডাটাবেস সূচীগুলি অনুসরণ করার জন্য সেরা অভ্যাসগুলি [বন্ধ]


17

সূচক ব্যবহার করে ডাটাবেসের কর্মক্ষমতা উন্নত করার জন্য কিছু ডিও এবং ডিএনটি কী কী?

একটি ডিও হ'ল একটি কেস যাতে সূচি তৈরি করা উচিত, বা অন্য সূচী সম্পর্কিত টিপ যা কর্মক্ষমতা উন্নত করবে।

একটি সূচি হ'ল কেস হবে যখন কোনও সূচক তৈরি করা উচিত নয়, বা অন্য কোনও সূচক সম্পর্কিত ক্রিয়া যা কার্য সম্পাদনকে আঘাত করতে পারে।


3
প্রোফাইল, প্রোফাইল, প্রোফাইল
গ্র্যান্ডমাস্টারবি

উত্তর:


15

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

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

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

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


17

এটি আপনি কীভাবে আপনার টেবিলগুলি ব্যবহার করেন তার উপর এটি অত্যন্ত নির্ভর করে। কোন একক এবং সহজ উত্তর নেই।

আমি আপনাকে যে সর্বোত্তম পরামর্শ দিতে পারি তা হ'ল: একটি টিউনিং উপদেষ্টা ব্যবহার করুন । আপনি অ্যাপ্লিকেশনটি ব্যবহার করার সময় তারা ডাটাবেস কমান্ডগুলি বিশ্লেষণ করবে, তারপরে আপনাকে অর্থবহ পরামর্শ দেওয়ার জন্য তারা এর বিরুদ্ধে লোড পরীক্ষা করবে।

এগুলি এসকিউএল সার্ভার এবং ওরাকল-এর জন্য বিদ্যমান । অন্যান্য ডিবিএমএসের সেগুলি আছে কিনা আমি জানি না, কেবলমাত্র আমি সন্দেহ করি যে তারা এ জাতীয় প্রাথমিক সরঞ্জাম সরবরাহ করে না।

কয়েকটি এলোমেলো recommandations:

  • প্রায়শই যেখানে শর্তে অন্তর্ভুক্ত থাকা কলামগুলিতে প্রয়োগ করা হয় তখন সূচিগুলি উচ্চ কার্যকারিতা লাভ সরবরাহ করে
  • আপনার প্রশ্নের সর্বাধিক ব্যবহৃত কলামের জন্য ক্লাস্টারড সূচক ব্যবহার করুন।
  • ভুলে যাবেন না যে আপনি কলামগুলির সংমিশ্রণ সহ একাধিক সূচী তৈরি করতে পারেন (সেগুলি আপনার প্রশ্নের ক্ষেত্রে ব্যবহৃত হয়)
  • অনেক সূচী থাকা INSERT কমান্ডের কর্মক্ষমতা হ্রাস পাবে।

শেষ পরামর্শ : আপনার প্রকল্পের জন্য যদি ডিবি পারফরম্যান্সগুলি সত্যই গুরুত্বপূর্ণ হয়, তবে একজন বিশেষজ্ঞ নিয়োগ করুন। এটা আমি কি করেছি।


2
কলামগুলির সংমিশ্রণে সূচিগুলির জন্য +1। কলামগুলিতে সূচী হয় aএবং সূচকের মতো bহয় না(a, b) । আধুনিক প্রায় উপর সূচক হিসাবে ভাল হিসাবে aএকটি শর্ত প্রশ্নের দ্রুত গাড়ী চালানোর আপ জন্য a, উপর ব্যাপক অবস্থার সঙ্গে প্রশ্নের জন্য ভাল aএবং b, এবং প্রশ্নের জন্য দরকারী নয় bএকা। (বেশিরভাগ ডাটাবেসগুলি এটি ব্যবহার করবে না
O

2
+1, "ক্যোয়ারী প্ল্যানগুলি পড়তে শিখুন যাতে আপনি কী
স্টিভেন এ। লো

4

@ পিয়ার 303 ইতিমধ্যে এটি বলেছে, তবে আমি এটি আবার বলব। আপনি কি কলামের সমন্বয় উপর ইনডেক্স ব্যবহার করুন। সংযুক্ত সূচকটি (a, b)কেবলমাত্র aসূচকের চেয়ে প্রশ্নের উপর কেবল সামান্য ধীর aএবং আপনার কোয়েরিটি উভয় কলামকে একত্রিত করে যদি ব্যাপকভাবে উন্নত হয়। কিছু ডাটাবেস টেবিলে আঘাত করার আগে aএবং এর bআগে সূচিতে যোগ দিতে পারে , তবে এটি সম্মিলিত সূচকের মতো প্রায় ভাল নয়। আপনি যখন একটি সম্মিলিত সূচক তৈরি করবেন তখন আপনার সম্মিলিত সূচীতে প্রথমে সর্বাধিক সন্ধান করা কলামটি দেওয়া উচিত।

যদি আপনার ডাটাবেস এটি সমর্থন করে তবে ডিও কলামগুলির চেয়ে ক্যোয়ারীতে প্রদর্শিত ফাংশনগুলিতে সূচি রাখুন। (আপনি যদি কোনও কলামে কোনও ফাংশন কল করে থাকেন তবে column কলামের সূচিগুলি অকেজো)

আপনি সত্য অস্থায়ী টেবিল সঙ্গে একটি ডাটাবেস ব্যবহার করে থাকেন যা আপনি তৈরি করতে পারেন এবং মাছি উপর ধ্বংস (যেমন পোস্টগ্রি মাইএসকিউএল, কিন্তু না ওরাকল), তারপর না অস্থায়ী টেবিলের উপর ইনডেক্স তৈরি করুন।

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

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

একটি বড় টেবিলের একটি ছোট ভগ্নাংশের চেয়ে বেশি অ্যাক্সেস করতে হবে এমন প্রশ্নের উপরে সূচকগুলি ব্যবহার করবেন না । (হার্ডওয়ারের উপরে কতটা ছোট নির্ভর করে 5 লিঙ্গ সূচীকরণে এটি কার্যকর হবে না যেহেতু আপনাকে এখনও 50% সারি অ্যাক্সেস করতে হবে। পরিবর্তে আপনি পুরো টেবিল স্ক্যানটি ব্যবহার করতে চান। কারণটি হ'ল সূচিগুলি এলোমেলোভাবে একটি বড় ফাইল অ্যাক্সেস করে, যার ফলে আপনার ডিস্ক সিকের প্রয়োজন হয়। ডিস্ক সিকস ধীর। পয়েন্ট হিসাবে একটি কেস হিসাবে আমি সম্প্রতি দেখেছি এমন এক ঘন্টা দীর্ঘ ক্যোয়ারীটি গতিতে পরিচালিত করেছি:

SELECT small_table.id, SUM(big_table.some_value)
FROM small_table
  JOIN big_table
    ON big_table.small_table_id = small_table.id
GROUP BY small_table.id

এটি নিম্নে পুনর্লিখন করে 3 মিনিটের নিচে যেতে:

SELECT small_table.id, big_table_summary.summed_value
FROM small_table
  JOIN (
      SELECT small_table_id, SUM(some_value) as summed_value
      FROM big_table
      GROUP BY small_table_id
    ) big_table_summary
    ON big_table_summary.small_table_id =  small_table.id

যা ডাটাবেসকে বুঝতে বাধ্য করেছিল যে এটি প্রলুব্ধকর সূচি ব্যবহার করার চেষ্টা করা উচিত নয় big_table.small_table_id। (ওরাকল এর মতো একটি ভাল ডাটাবেসটি নিজে থেকে এটি বের করা উচিত This এই কোয়েরিটি মাইএসকিউএল চলছিল))

আপডেট: এখানে আমি তৈরি করা ডিস্ক সন্ধানের পয়েন্টটির ব্যাখ্যা এখানে দেওয়া হয়েছে। একটি সূচী টেবিলে ডেটা কোথায় রয়েছে তা বলার জন্য একটি তাত্ক্ষণিক অনুসন্ধান দেয়। এটি সাধারণত একটি জয় যেহেতু আপনার কেবলমাত্র সেই ডেটাতে নজর দেওয়া দরকার যা আপনি দেখার প্রয়োজন। তবে সবসময় নয়, বিশেষত যদি আপনি অবশেষে প্রচুর ডেটা দেখেন। ডিস্কগুলি ডেটা স্ট্রিম ভাল করে, তবে লকআপগুলি ধীর করে দেয়। ডিস্কের ডেটাতে এলোমেলোভাবে সন্ধানের জন্য সেকেন্ডের 1/200 তম সময় লাগে। ক্যোয়ারির ধীর সংস্করণটি এর মধ্যে ,000০০,০০০ এর মতো কিছু করছে এবং এক ঘন্টার কাছাকাছি লেগেছে। (এটি এর চেয়ে আরও বেশি নজরদারি করেছে, তবে ক্যাশেগুলির মধ্যে কিছুটি ধরা পড়ে)) বিপরীতভাবে দ্রুত সংস্করণটি জানত যে এটি 70 এমবি / সেকেন্ডের মতো কিছুতে পড়তে হয়েছিল এবং ডেটা প্রবাহিত করে। এটি 3 মিনিটের নীচে 11 গিগাবাইট টেবিলের মাধ্যমে পেয়েছে।


হাই, আমি আপনার উদাহরণ দ্বারা বিভ্রান্ত আমি ভাবতাম যে সূচকটি ব্যবহার করে জিনিসগুলি আরও দ্রুত হয়ে উঠবে, তা কি সূচকের পয়েন্ট নয়? আপনি কি বলছেন যে যদি কোনও কোয়েরি যদি কোনও টেবিলের 5% অ্যাক্সেস করতে পারে তবে আপনি যে কলামটিতে সন্ধান করছেন তাতে একটি সূচক থাকা জিনিসগুলি ধীর করে দেবে?
আপভোটটি ক্লিক করুন

@ ক্লিক আপভোট: যদি কোনও কোয়েরি যদি কোনও টেবিলের 5% (হার্ডওয়ার এবং ডেটার উপর নির্ভর করে সঠিক ভগ্নাংশ) এর বেশি অ্যাক্সেস করে তবে এই ক্যোয়ারির জন্য কোনও সূচক ব্যবহার না করা দ্রুত। আপনি যতক্ষণ না এটি ব্যবহার করবেন না ততক্ষণ একটি সূচক থাকা ক্ষতি করে না। আমি কেন আরও তা বিশদ দিয়ে আপডেট করব।
বুটিলি

দরকারী তথ্য। এর জন্য আরও উদাহরণস্বরূপ mysqlperformanceblog.com/2007/08/28/… তবে আমি ভাবছিলাম, 'কী উপেক্ষা করা' কি এটির মতো নয় যে আপনাকে এটিকে সাবকিউরি তৈরি করা দরকার?
ইনকা

@ আইঙ্কা: আমি 'অগ্রাহ্য কী' সম্পর্কে সচেতন ছিলাম না। আমি ডেটাবেসগুলিতে যথেষ্ট স্যুইচ করি যে প্রায়শই ডেটাবেস নির্দিষ্ট জিনিস থাকে যা সম্পর্কে আমি অবগত নই। এর শব্দগুলি থেকে এটি কার্যকর হবে তবে আমার চূড়ান্ত সমাধানের চেয়ে কম দক্ষতার সাথে। পার্থক্যটি যে এতে যোগদান করবে, তারপরে গ্রুপ, যখন আমার গ্রুপ হয়েছিল, তারপরে যোগ দিল। এটি যোগদানের কাজটি সংরক্ষণ করে কারণ কম রেকর্ডগুলিতে যোগদানের প্রয়োজন।
btilly

"একটি ভাল ডাটাবেস (উদাহরণস্বরূপ ওরাকল, তবে মাইএসকিউএল নয়)": দয়া করে, মূup় প্রচারমূলক স্টাফগুলি এড়িয়ে চলুন, বিশেষত যখন আপনি এই সত্যটি উপেক্ষা করেন যে মাইএসকিউএল একই সময়ে একাধিক সূচককে সঠিকভাবে ব্যবহার করতে পারে (ক্যোয়ারী পরিকল্পনায় "আইএনডেক্স মার্জ" হিসাবে চিহ্নিত হয়েছে) ।
প্যাট্রিক আলার্ট

2

কর: আপনি কোয়েরি এবং / বা তুলনার মাধ্যমে সর্বাধিক অ্যাক্সেস করে এমন খুব কম ক্ষেত্র সূচক করুন।

করবেন না: টেবিলের প্রতিটি ক্ষেত্র সূচী করে তা দ্রুত তৈরি করবে thinking

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


2

মূলত, সূচকগুলি অনুসন্ধানের গতি বাড়ায় তবে লেখাগুলি কমিয়ে দেয় এবং তারা স্থান গ্রহণ করে। এটাই বাণিজ্য বন্ধ হচ্ছে।

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

পাঠ্য ক্ষেত্রগুলির জন্য, আপনি ক্ষেত্রের একটি অংশে সূচক করতে পারেন (উদাহরণস্বরূপ, প্রথম cha টি অক্ষর) যা আপনার ক্যোয়ারীটিকে ত্বরান্বিত করবে তবে সূচকগুলিতে বোঝা হালকা করবে। পূর্ণ পাঠ্য অনুসন্ধানে (সন্ধান করুন like %substring%) বিভিন্ন কৌশল প্রয়োজন, যার সাথে আমি পরিচিত নই, তাই আমি আপনাকে সেখানে পরামর্শ দিতে পারি না।

একটি গুরুত্বপূর্ণ পরিস্থিতি যেখানে সূচকগুলি সাহায্য করবে না: আপনি তারিখের কোনও অংশে অনুসন্ধান (/ যোগদান / ক্রম) সন্ধান করার সময় আপনি সম্পূর্ণ তারিখ বা তারিখের ক্ষেত্রের সূচকটি ব্যবহার করতে পারবেন না। উপরের একটি সূচক date_createdআপনাকে এর মতো প্রশ্নের সাথে সহায়তা করবে না select * from t where year(date_created) = 2011। মাইএসকিএলে আপনি তারিখের অংশে একটি সূচক তৈরি করতে পারবেন না। (যখন আপনি ' between' এর পরিবর্তে year()তারিখের ক্ষেত্রের সূচকটি ব্যবহার করতে পারেন তখন ব্যবহার করেন))

ম্যানুয়ালটিতে এমওয়াইএসকিউএল সম্পর্কিত আরও তথ্য: http://dev.mysql.com/doc/refman/5.6/en/optimization-indexes.html


1

করুন: ক্লাস্টারড ইনডেক্সের মোট আকার সর্বনিম্ন রাখার চেষ্টা করুন। ক্লাস্টারড ইনডেক্স এন্ট্রিগুলি অন্যান্য নন-ক্লাস্টারড ইনডেক্সগুলিতে অন্তর্ভুক্ত করা হবে এবং এখান থেকে ডিস্কের স্থান নষ্ট করার সম্ভাবনা আসে।


1

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

আপনি কোনও বইতে দ্রুত কিছু খুঁজে পেতে একটি সূচক ব্যবহার করেন। পুরো বইটি স্ক্যান করার পরিবর্তে আপনাকে কেবল সূচকে কীটি খুঁজে বের করতে হবে (একটি সূচক সাধারণত কোনওভাবে বাছাই করা হয় (বিভাগ অনুসারে, বৈজ্ঞানিক ক্ষেত্রের দ্বারা, historicalতিহাসিক যুগ দ্বারা, ইত্যাদি), এর অর্থ এটিও আপনাকে স্ক্যান করতে হবে না পুরো সূচক) এবং তারপরে ডান পৃষ্ঠায় ঝাঁপ দাও।

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

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

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