মাইএসকিউএল সূচকগুলি কীভাবে কাজ করে?


402

আমি মাইএসকিউএল সূচকগুলি কীভাবে কাজ করে তাতে খুব আগ্রহী, আরও নির্দিষ্টভাবে, তারা কীভাবে পুরো টেবিলটি স্ক্যান না করে অনুরোধ করা ডেটা ফেরত দিতে পারে?

এটি অফ-টপিক, আমি জানি, তবে যদি এমন কেউ থাকে যে আমাকে এই বিষয়টি বিস্তারিতভাবে ব্যাখ্যা করতে পারে তবে আমি খুব কৃতজ্ঞ হব।



এটি একটি বিস্তৃত প্রশ্ন। আপনার কাছে যদি এমন কোনও ক্যোয়ারির নির্দিষ্ট উদাহরণ রয়েছে যা সূচক ব্যবহার করবে না এবং আপনি কেন জানেন না তবে আপনি এটি পোস্ট করতে পারেন এবং লোকেরা সহায়তা করতে পারে।
হামারাইট

SELECT * FROM members WHERE id = '1'- তাহলে সূচকের সাথে কেন এটি দ্রুত কাজ করে? সূচকটি এখানে কী করে?

2
এটি এমন একটি ক্যোয়ারির মতো দেখাচ্ছে যা কেবল একটি নির্দিষ্ট, সূচিযুক্ত রেকর্ড দেখায় (সম্ভবত প্রাথমিক কী দ্বারা চিহ্নিত) identified সূচকটি এটিকে দ্রুত করে তোলে কারণ এটি মেমরিতে সঞ্চয় করা হয়, সংশ্লিষ্ট সূচী সারিতে সন্ধান করা যেতে পারে এবং এটিতে একটি পয়েন্টার রয়েছে যেখানে আসল ডেটা সংরক্ষণ করা হয়। সুতরাং মাইএসকিউএলটি টেবিলটি স্ক্যান না করে সারণিতে সঠিক স্থানে যেতে পারে।
হামারাইট

খুব ভালো ধন্যবাদ!
লঘিমা জাতি কক্ষপথে

উত্তর:


513

মূলত কোনও টেবিলের একটি সূচক একটি বইয়ের সূচির মতো কাজ করে (নামটি থেকেই এসেছে):

ধরা যাক আপনার কাছে ডেটাবেস সম্পর্কে একটি বই আছে এবং আপনি সঞ্চয় স্থান সম্পর্কে কিছু বলতে চান। কোনও সূচি ছাড়াই (কোনও সামগ্রীর টেবিলের মতো কোনও অন্যান্য সহায়তা অনুমান না করে) আপনাকে বিষয়গুলি (এটি একটি full table scan) না পাওয়া পর্যন্ত একের পর এক পৃষ্ঠাগুলি অতিক্রম করতে হবে । অন্যদিকে, একটি সূচকের কীওয়ার্ডের একটি তালিকা রয়েছে, সুতরাং আপনি সূচকের সাথে পরামর্শ করতে পারেন এবং storageএটি ১১৩-১২০,২৩১ এবং ৩৫৪ পৃষ্ঠায় উল্লিখিত রয়েছে Then সূচক, কিছুটা দ্রুত)।

অবশ্যই, সূচকটি কতটা কার্যকর হবে তা অনেক কিছুর উপর নির্ভর করে - কয়েকটি উদাহরণ, উপরোক্ত অনুকরণটি ব্যবহার করে:

  • আপনার যদি ডাটাবেসগুলিতে একটি বই থাকে এবং "ডাটাবেস" শব্দটি সূচিযুক্ত হয়, আপনি দেখতে পাবেন যে এটি পৃষ্ঠা 1-59,61-290, এবং 292 থেকে 400 পৃষ্ঠায় উল্লিখিত হয়েছে such সেক্ষেত্রে সূচকটি খুব বেশি সহায়ক নয় এবং এটি হতে পারে একের পর এক পৃষ্ঠাগুলি যেতে দ্রুত করুন (একটি ডাটাবেসে এটি "দুর্বল নির্বাচন")।
  • একটি 10-পৃষ্ঠার বইয়ের জন্য, কোনও সূচী তৈরি করার কোনও অর্থ নেই, কারণ আপনি 5-পৃষ্ঠার সূচী দ্বারা নির্ধারিত 10-পৃষ্ঠার বইটি শেষ করতে পারেন, যা কেবল নিখুঁত - কেবলমাত্র 10 পৃষ্ঠাগুলি স্ক্যান করুন এবং এটি দিয়ে সম্পন্ন করুন ।
  • সূচকটিও দরকারী হওয়া দরকার - সাধারণত সূচকের কোনও বক্তব্য নেই যেমন প্রতি পৃষ্ঠায় "এল" অক্ষরের ফ্রিকোয়েন্সি।

3
আপনি এটি ব্যাখ্যা করছেন যে এটি অভ্যন্তরীণভাবে কীভাবে প্রযুক্তিগতভাবে কাজ করে না তা নয়।
টুটু কুমারী

@ টুটু কুমারী: প্রশ্নের সংশোধনী দেখুন; বর্তমান প্রশ্নের সাথে মানিয়ে নিতে নির্দ্বিধায় দ্বিধা বোধ করুন (বিভিন্ন ইঞ্জিন এবং সূচক প্রকারটি নোট করুন - উদাহরণস্বরূপ ডকুমেন্টেশনটি এখানে দেখুন: dev.mysql.com/doc/refman/8.0/en/index-btree-hash.html )
পিসকভোর

259

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

বিভিন্ন ধরণের সূচক রয়েছে এবং সেগুলি স্টোরেজ স্তরটিতে প্রয়োগ করা হয়, সুতরাং তাদের মধ্যে কোনও মান নেই এবং তারা যে স্টোরেজ ইঞ্জিনটি ব্যবহার করছেন তার উপরও নির্ভর করে।

ইনোডিবি এবং বি + ট্রি সূচক

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

এই সূচক প্রকারের "সমস্যা" হ'ল আপনাকে সূচকটি ব্যবহার করতে বামতম মানের জন্য জিজ্ঞাসা করতে হবে। সুতরাং, যদি আপনার সূচকের দুটি কলাম থাকে, শেষ_নাম এবং প্রথম নামটি বলুন, আপনি এই ক্ষেত্রগুলিকে জিজ্ঞাসা করার ক্রমটি অনেক গুরুত্বপূর্ণ

সুতরাং, নিম্নলিখিত টেবিল দেওয়া:

CREATE TABLE person (
    last_name VARCHAR(50) NOT NULL,
    first_name VARCHAR(50) NOT NULL,
    INDEX (last_name, first_name)
);

এই ক্যোয়ারী সূচকের সুবিধা নেবে:

SELECT last_name, first_name FROM person
WHERE last_name = "John" AND first_name LIKE "J%"

তবে নিম্নলিখিতটি তা মানবে না

SELECT last_name, first_name FROM person WHERE first_name = "Constantine"

কারণ আপনি first_nameপ্রথমে কলামটি অনুসন্ধান করছেন এবং এটি সূচকের বামতম কলাম নয়।

এই শেষ উদাহরণটি আরও খারাপ:

SELECT last_name, first_name FROM person WHERE first_name LIKE "%Constantine"

কারণ এখন, আপনি সূচীর সবচেয়ে ডানদিকের ক্ষেত্রের সবচেয়ে অংশের সাথে তুলনা করছেন।

হ্যাশ সূচক

এটি একটি আলাদা সূচক প্রকার যা দুর্ভাগ্যক্রমে, কেবল মেমরি ব্যাকএন্ড সমর্থন করে। ফাস্ট কিন্তু পূর্ণ লুক-, যার মানে আপনি এটি ব্যবহার না পারেন, অপারেশন পছন্দের কেবল দরকারী এটা এর বাজ >, <বা LIKE

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

আপনার যদি একটি বড় VARCHARক্ষেত্র থাকে, আপনি একটি বি-ট্রি ব্যবহার করার সময়, একটি অন্য কলাম তৈরি করে এবং এতে বড় মানের একটি হ্যাশ সংরক্ষণ করে একটি হ্যাশ সূচকের ব্যবহার "অনুকরণ" করতে পারেন। ধরা যাক আপনি কোনও ক্ষেত্রে একটি url সঞ্চয় করছেন এবং মানগুলি বেশ বড়। আপনি যেকোন একটি পূর্ণসংখ্যার ক্ষেত্রও তৈরি করতে এবং ইউআরএল সন্নিবেশ করানোর সময় url_hashহ্যাশ ফাংশনের মতো CRC32বা অন্য কোনও হ্যাশ ফাংশন ব্যবহার করতে পারেন। এবং তারপরে, যখন এই মানটির জন্য আপনাকে জিজ্ঞাসা করতে হবে, আপনি এর মতো কিছু করতে পারেন:

SELECT url FROM url_table WHERE url_hash=CRC32("http://gnu.org");

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

SELECT url FROM url_table 
WHERE url_hash=CRC32("http://gnu.org") AND url="http://gnu.org";

এমনকি সংঘর্ষের সংখ্যাটি উচ্চ কারণ সত্ত্বেও জিনিসগুলি হ্যাশ করার পক্ষে মূল্য রয়েছে আপনি বারবার হ্যাশগুলির বিরুদ্ধে কেবল দ্বিতীয় তুলনা (স্ট্রিং এক) সম্পাদন করবেন।

দুর্ভাগ্যক্রমে, এই কৌশলটি ব্যবহার করে, আপনাকে urlক্ষেত্রটির সাথে তুলনা করতে এখনও টেবিলটি চাপতে হবে।

শেষ করি

আপনি যখনই অপ্টিমাইজেশনের বিষয়ে কথা বলতে চান প্রতিটি বিষয় বিবেচনা করতে পারেন:

  1. পূর্ণসংখ্যার তুলনা স্ট্রিং তুলনার চেয়ে অনেক দ্রুত। এটিতে হ্যাশ সূচকটির অনুকরণ সম্পর্কে উদাহরণ সহ চিত্রিত করা যেতে পারে InnoDB

  2. হতে পারে, কোনও প্রক্রিয়াতে অতিরিক্ত পদক্ষেপ যুক্ত করা এটি দ্রুততর করে তোলে, ধীর নয়। এটি সত্য দ্বারা চিত্রিত করা যেতে পারে যে আপনি SELECTএকটিটিকে দুটি ধাপে বিভক্ত করে নতুনটিকে তৈরি করা মেমরি টেবিলের মধ্যে প্রথম এক স্টোরের মান তৈরি করে এবং তারপরে এই দ্বিতীয় সারণীতে ভারী প্রশ্নগুলি চালিয়ে যেতে পারেন।

মাইএসকিউএল এর অন্যান্য সূচীগুলিও রয়েছে, তবে আমি মনে করি যে বি + ট্রি একটি সবচেয়ে বেশি ব্যবহৃত হয় এবং হ্যাশটি জানা ভাল জিনিস তবে আপনি মাইএসকিউএল ডকুমেন্টেশনে অন্যগুলি খুঁজে পেতে পারেন ।

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


2
নিম্নলিখিত প্রশ্নের ক্ষেত্রে কি নিম্নলিখিত প্রশ্নগুলির সুবিধা হবে? 1। SELECT last_name, first_name FROM person WHERE last_name= "Constantine"SELECT last_name, first_name FROM person WHERE last_name LIKE "%Constantine"
অক্ষয় তারু

1
প্রথম ক্যোরি হবে, দ্বিতীয় ক্যোয়ারী করবে না। এক্সপ্লেইন ব্যবহার করুন: dev.mysql.com/doc/refman/5.5/en/explain.html মাইএসকিউএল এর সাথে দ্বিতীয় ক্যোয়ারী সূচী করার জন্য আপনাকে ফুলটেক্সট ইন্ডেক্সটি ব্যবহার করতে হবে: dev.mysql.com/doc/refman/5.5/en/fulltext- অনুসন্ধানের এইচটিএমএল
এমিলিও নিকোলস

5
আমি আপনাকে উত্সাহিত করেছি কারণ আপনি 127 এ ছিলেন এবং # 1 উত্তরটি 256 এ ছিল everything আমি সবকিছু সুন্দর এবং পরিষ্কার, বাইনারি-বুদ্ধিমান এড়াতে পারিনি।
পিবারনে

এটি আমার জন্য নতুন তথ্য ছিল "আপনি এই ক্ষেত্রগুলিকে অনেক গুরুত্বপূর্ণ বলে জিজ্ঞাসা করুন" " ধন্যবাদ।
খত্রি

1
@ পবার্নি তিন বছর পরে তারা যথাক্রমে 256 এবং 512 এর কাছাকাছি, এটাকে আমি বাইনারি-ওয়াইজ বৃদ্ধি বলি!
Nanocv

43

মূলত একটি সূচক আপনার সমস্ত কীগুলির মানচিত্র যাতে ক্রম অনুসারে বাছাই করা হয়। ক্রমযুক্ত একটি তালিকা সহ, তারপরে প্রতিটি কী পরীক্ষা করার পরিবর্তে এটি এর মতো কিছু করতে পারে:

1: তালিকার মাঝখানে যান - আমি যা খুঁজছি তার চেয়ে বেশি বা কম?

2: উচ্চতর হলে মধ্য এবং নীচের মাঝখানে অর্ধেক পয়েন্টে যান, যদি নীচু হয়, মাঝারি এবং উপরে হয়

3: উচ্চতর বা নিম্ন? আবার মিডল পয়েন্টে ঝাঁপ দাও ইত্যাদি

সেই যুক্তিটি ব্যবহার করে, আপনি প্রতিটি আইটেমটি পরীক্ষা না করে প্রায় 7 টি ধাপে বাছাই করা তালিকায় একটি উপাদান খুঁজে পেতে পারেন।

স্পষ্টতই জটিলতা রয়েছে তবে এটি আপনাকে প্রাথমিক ধারণা দেয়।


29
একে বাইনারি অনুসন্ধান বলা হয়।
ddlshack

ধন্যবাদ, পরিশেষে একটি উত্তর যা তাড়াতাড়ি কেন তা ব্যাখ্যা করে এবং ডিবি সূচির সাথে কীভাবে কাজ করে তা নয়।
গের্শন হারকিজেগ

পদক্ষেপের আসল সংখ্যাটি ডেটাগুলির উপর নির্ভর করে - আপনার পরিসীমা জুড়ে অনন্য মান এবং বিতরণ। 7 হ'ল 100 টি মানের জন্য তাত্ত্বিক সর্বোচ্চ। কিভাবে এখানে ধাপের সংখ্যা গণনা করার জন্য সম্পূর্ণ আলোচনা stackoverflow.com/questions/10571170/...
জশুয়া

সর্বাধিক সাধারণ মাইএসকিউএল সূচক হল একটি বি + ট্রি যা বাইনারি অনুসন্ধানের অনুরূপ কাজ করে তবে একেবারে একই নয়। অ্যালগরিদমিক জটিলতা একই তবে এটি যেভাবে অনুসন্ধান করে তা নয়। দেখুন en.wikipedia.org/wiki/B-tree
ম্যাট

4

এই লিঙ্কটি একবার দেখুন: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

তারা কীভাবে কাজ করে তা কোনও এসও পোস্টে কভার করার জন্য খুব বেশি বিস্তৃত।

আমি দেখেছি সূচকের সেরা ব্যাখ্যা এখানে । দুর্ভাগ্যক্রমে এটি এসকিউএল সার্ভারের জন্য, মাইএসকিউএল নয়। আমি নিশ্চিত না যে দু'জনের কতটা মিল রয়েছে ...


2
চমৎকার নিবন্ধ। আমি এসকিউএল সার্ভার জানি না, তবে বেসিক ওয়ার্কিংগুলি দেখতে অনেকটা সাদৃশ্যপূর্ণ। (মেটানোট: দ্বিতীয় লিঙ্কযুক্ত নিবন্ধে সিএসএস শৈলীগুলি অক্ষম করা) বিষয়বস্তুটি
ছাপিয়ে রাখে

3

এ নিন এই ইন্ডেক্সিং সম্পর্কে আরো বিস্তারিত জানার জন্য ভিডিও

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

CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...);

আপনি একটি সূচক তৈরি করতে এক বা একাধিক কলাম ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আমরা tutorials_tblটিউটোরিয়াল_অথর ব্যবহার করে একটি সূচক তৈরি করতে পারি ।

CREATE UNIQUE INDEX AUTHOR_INDEX
ON tutorials_tbl (tutorial_author)

আপনি কোনও টেবিলে একটি সাধারণ সূচক তৈরি করতে পারেন। সাধারণ সূচক তৈরি করতে কোয়েরি থেকে অনন্য কীওয়ার্ডটি বাদ দিন। সাধারণ সূচী কোনও সারণীতে সদৃশ মানকে অনুমতি দেয়।

যদি আপনি একটি কলামে অবতরণ ক্রমে মানগুলি সূচক করতে চান, আপনি কলামের নাম পরে সংরক্ষিত শব্দ DESC যুক্ত করতে পারেন।

mysql> CREATE UNIQUE INDEX AUTHOR_INDEX
ON tutorials_tbl (tutorial_author DESC)

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

তিনি তার ভিডিও প্রচার করতে চান। এলওএল
ইলিয়াস করিম

1

আমি আমার 2 সেন্ট যোগ করতে চাই। আমি একটি ডাটাবেস বিশেষজ্ঞ হতে অনেক দূরে, কিন্তু আমি সম্প্রতি এই বিষয়ে কিছুটা পড়েছি; আমার চেষ্টা এবং একটি ELI5 দেওয়ার জন্য যথেষ্ট। সুতরাং, এখানে সাধারণ ব্যক্তির ব্যাখ্যা হতে পারে।


আমি এটিকে বুঝতে পারি যে কোনও সূচকটি আপনার টেবিলের মিনি-মিররের মতো, বেশ অনেকটা একটি এসোসিয়েটিভ অ্যারের মতো। যদি আপনি এটি একটি মিলিত কী দিয়ে খাওয়াতে থাকেন তবে আপনি কেবল একটি "কমান্ড" এ সারিটিতে যেতে পারেন।

তবে যদি আপনার সেই সূচক / অ্যারে না থাকে তবে ক্যোয়ারী ইন্টারপ্রেটারকে অবশ্যই সমস্ত সারি পেরিয়ে একটি ম্যাচ (সম্পূর্ণ টেবিল স্ক্যান) পরীক্ষা করতে একটি লুপ ব্যবহার করতে হবে।

একটি সূচক থাকাতে অতিরিক্ত স্টোরেজটির "ডাউনসাইড" রয়েছে (সেই মিনি-আয়নাটির জন্য), সামগ্রীতে দ্রুত অনুসন্ধানের "উত্সাহ" এর বিনিময়ে।

নোট করুন (আপনার ডিবি ইঞ্জিনের উপর নির্ভরশীলভাবে) প্রাথমিক, বিদেশী বা অনন্য কী তৈরি করা স্বয়ংক্রিয়ভাবে একটি संबंधित সূচকও সেট আপ করে। সেই একই নীতিটি মূলত কেন এবং কীভাবে কীগুলি কাজ করে তা।


1

উত্তরের তালিকায় কিছু ভিজ্যুয়াল উপস্থাপনা যুক্ত করা হচ্ছে। এখানে চিত্র বর্ণনা লিখুন

মাইএসকিউএল ইন্ডিয়ারেশনের একটি অতিরিক্ত স্তর ব্যবহার করে: গৌণ সূচক রেকর্ডগুলি প্রাথমিক সূচক রেকর্ডগুলিতে নির্দেশ করে এবং প্রাথমিক সূচকটি নিজেই ডিস্কের সারি অবস্থানগুলি ধারণ করে। যদি একটি সারি অফসেট পরিবর্তন হয় তবে কেবল প্রাথমিক সূচি আপডেট করতে হবে।

ক্যাভ্যাট: ডিস্কের ডেটা কাঠামোটি চিত্রের সমতল দেখায় তবে আসলে এটি একটি বি + গাছ is

সূত্র: লিংক


1

মাইএসকিউএল ইনোডিবিতে দুটি ধরণের সূচক রয়েছে।

  1. প্রাথমিক কী যা ক্লাস্টারড ইনডেক্স বলে। সূচক কী শব্দগুলি বি + ট্রি লিফ নোডে প্রকৃত রেকর্ড ডেটা সহ সংরক্ষণ করা হয়।

  2. মাধ্যমিক কী যা ক্লাস্টারযুক্ত সূচক নয়। এই সূচকগুলি কেবল বি + ট্রি পাতার নোডে তাদের নিজস্ব সূচি কী শব্দগুলির সাথে প্রাথমিক কীগুলির মূল শব্দগুলি সঞ্চয় করে। সুতরাং গৌণ সূচক থেকে অনুসন্ধান করার সময়, এটি প্রথমে তার প্রাথমিক কী সূচক কী শব্দগুলি সন্ধান করবে এবং প্রকৃত ডেটা রেকর্ডগুলি সন্ধান করতে প্রাথমিক কী বি + ট্রি স্ক্যান করবে। এটি প্রাথমিক সূচী অনুসন্ধানের তুলনায় গৌণ সূচককে ধীর করে দেবে। তবে, selectকলামগুলি সমস্ত গৌণ সূচকগুলিতে থাকলে, আবার প্রাথমিক সূচি বি + ট্রি দেখার দরকার নেই। একে আচ্ছাদন সূচক বলে।

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