আরডিবিএমএসে "সূচক" এর অর্থ কী? [বন্ধ]


21

আমি বেশিরভাগ বিকাশকারীদের মতো সূচকগুলি ব্যবহার করি (বেশিরভাগ ক্ষেত্রে ... ভাল! সূচক), তবে আমি নিশ্চিত যে সূচি ব্যবহার করে একটি ডাটাবেস অপ্টিমাইজ করার অনেক সূক্ষ্ম উপায় রয়েছে। আমি নিশ্চিত না এটি ডিবিএমএসের কোনও প্রয়োগের ক্ষেত্রে সুনির্দিষ্ট কিনা।

আমার প্রশ্নটি হল: সূচকটি কীভাবে ব্যবহার করা যায় তার ভাল উদাহরণগুলি কী কী (মৌলিক, সুস্পষ্ট কেস বাদে) এবং কোনও টেবিলে কোনও সূচক নির্দিষ্ট করার সময় কোনও ডিবিএমএস কীভাবে তার ডাটাবেসটিকে অনুকূল করে তোলে?


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

আমি গ্রন্থাগার রূপক mysqlperformanceblog.com/2011/08/30/… ব্যবহার করে সূচীগুলি ব্যাখ্যা করতে চাই See দেখুন কিনা এটি সাহায্য করে ..
জোনাথন

উত্তর:


11

একটি সূচিটিকে "বিষয়বস্তুর সারণী" হিসাবে ভাবুন ... এটি কোনও ফাইলের মধ্যে পয়েন্টারগুলির অর্ডার করা তালিকা, ওরফে অফসেট। বলুন যে আপনার মিলিয়নে মিলিয়ন মিলিয়ন রেকর্ড সঞ্চিত মানদণ্ডের জন্য টেবিলটি অনুসন্ধানের চেয়ে মিলের জন্য আদেশযুক্ত তালিকার রেফারেন্স করা আরও দ্রুত, তারপরে নির্দিষ্ট মেলানো সারিগুলিতে পয়েন্টারগুলি স্ট্যাক করুন। সূচকের একটি নিখুঁত উদাহরণ হল একটি সারণী প্রাথমিক কী ক্ষেত্র, সাধারণত এটির "আইডি" ক্ষেত্র। আপনি যদি সারি আইডি # 11234566 চান, তবে 11234566 পজিশনের জন্য ডেটা উত্সটি স্ক্যান করার চেয়ে ডেটাতে পয়েন্টার চেয়ে সূচকটি আরও দ্রুত জিজ্ঞাসা করুন।

এখানে সূচকের খুব সুস্পষ্ট ব্যবহার নয়:

CREATE TABLE activity_log (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
activity_type_id SMALLINT UNSIGNED NOT NULL,
datetime_created DATETIME
KEY(activity_type_id),
PRIMARY KEY(id)
);
CREATE TABLE activity_log_to_date_key (
activity_log_id INT UNSIGNED NOT NULL,
date_created_key  INT UNSIGNED NOT NULL REFERENCES dim_datetime(id),
UNIQUE KEY(activity_log_id),
KEY(date_created_key)
);
CREATE TABLE dim_datetime (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
date_hour DATETIME NOT NULL,
PRIMARY KEY(id),
KEY(date_hour)
);

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

নমুনা ক্যোয়ারী:

SELECT a.activity_log_id, al.activity_type_id, al.datetime_created
FROM activity_log_to_date_key a 
INNER JOIN dim_datetime d ON (d.id = a.date_created_key)
LEFT JOIN activity_log al ON (al.id = a.activity_log_id)
WHERE d.date_hour BETWEEN '2009-01-01 00:00:00' AND '2009-06-01 12:00:00';

ধন্যবাদ, এটা খুব পরিষ্কার! আপনার উদাহরণে, "প্রাথমিক" কীভাবে আরডিএমবিএস "অফসেট" সঞ্চয় করবে, বা এটি কেবল স্বতন্ত্রতার সীমাবদ্ধতার জন্য ব্যবহৃত হবে?
টমাস জোলিন

9

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

উদাহরণস্বরূপ, যদি সারিগুলির জন্য একটি বৃহত টেবিল অনুসন্ধান করা WHERE AnIntegerColumn = 42 AND AnOtherInt = 69হয় তবে সেই সারিগুলির দ্রুততম রুটটি AnInteger Column এবং AnOtherInt দুটি কলামে একটি সূচক হবে। আপনার যদি কেবল স্বতন্ত্রভাবে প্রতিটিতে একটি সূচক থাকে তবে কোনও সম্মিলিত সূচক ডিবি অন্যথায় একটি বা অন্য সূচী অনুসন্ধান করবে এবং দ্বিতীয় দফা দিয়ে পৃথকভাবে ফলাফলগুলি ফিল্টার করবে, বা উভয় স্ক্যান করবে এবং ফলাফলগুলি পরে বিবাহ করবে।

যৌগিক সূচকগুলির সাহায্যে আরও একটি সাধারণ সরল অপারেশন উন্নত করা যেতে পারে WHERE SomeColumn = <SomeValue> ORDER BY SomeOtherColumn- সোমারকলাম এবং সামোথারকলামে কোনও সূচক থাকলে (ডান ক্রমে) কিছু পরিস্থিতিতে একই সময়ে ফিল্টারিং এবং অর্ডার ক্রিয়াকলাপ সম্পাদন করা যেতে পারে।

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


2

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


গৌরবের উত্তরে যুক্ত করতে, "এক্সটেন্ডেড এক্সটেন্ডেড" ব্যবহার করুন, তারপরে আপনার প্রশ্নের কীভাবে অনুবাদ করা হয়েছে তা দেখতে তত্ক্ষণাত্ "দেখান সতর্কতা" টাইপ করুন।
এলোমেলো

1

এখানে আমি এখনও কিছু উল্লেখ করে দেখিনি যে হ'ল আপনি যখন একাধিক ডিস্ক রেখেছেন তখন সম্ভবত সম্ভবত আপনার সূচকটি অন্য ডিস্কে রেখে দিতে চান যেখানে ডেটা আসলে রয়েছে than এটি কিছু অপারেশন গতি বাড়িয়ে তুলতে পারে। আমি মনে করি এটি সঠিকভাবে এটিতে একটি প্রশ্নের দাবি করে।


এটি সত্য ছিল তবে আজকাল আমরা বলি আপনার আই / ও সাব সিস্টেমটি দ্বিতীয়-অনুমান করার চেষ্টা করবেন না। আপনি জানেন না যে কোনও স্টোরেজ অ্যারে আপনার ডেটা কোথায় রাখবে।
গাইউস

1
@ গাইউস আমার পরিবর্তে এর অর্থ হ'ল যদি আপনার কাছে RAID5 (বা এর মতো) সেটআপ না থাকে তবে ই: সূচকগুলি E :, ডেটা এফ:, ইত্যাদির উপর রাখুন
jcolebrand
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.