Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

SQL अनुक्रमणिका का परिचय

रिलेशनल डेटाबेस सिस्टम में, एक डेटाबेस इंडेक्स डेटा पुनर्प्राप्ति के लिए एक अत्यंत शक्तिशाली उपकरण है। इस गाइड में, आप अद्वितीय अनुक्रमणिका, प्राथमिक कुंजी और समग्र प्राथमिक कुंजी के बारे में जानेंगे।

डेटाबेस इंडेक्स क्या है?

एक डेटाबेस अनुक्रमणिका डेटाबेस तालिका से जुड़ी एक डेटा संरचना वस्तु है। इसका उपयोग डेटाबेस प्रश्नों की गति को बढ़ाने के लिए किया जाता है (SQL SELECT . के माध्यम से) आज्ञा)। सामान्य तौर पर, बनाने के लिए इंडेक्स के प्रकार तय करने के लिए अच्छी तरह से परिभाषित तरीके हैं। यह काफी हद तक इस बात से नियंत्रित होता है कि डेटाबेस में टेबल एक दूसरे से कैसे संबंधित हैं और डेटा कैसे पुनर्प्राप्त किया जाता है।

इंडेक्स का उपयोग क्यों करें?

सामान्य तौर पर, SQL SELECT . के माध्यम से तालिका में क्वेरी (या लुकअप) आदेश अनुक्रमिक हैं। अनुक्रमिक लुकअप के लिए तालिका के शीर्ष पर प्रारंभ करने और वांछित डेटा प्राप्त होने तक डेटा की प्रत्येक पंक्ति को पढ़ने की आवश्यकता होती है। यह बेहद अक्षम है और गति के मामले में एक महंगा ऑपरेशन हो सकता है।

दूसरी ओर, इंडेक्स इंडेक्स वैल्यू की गणना करने के लिए हैश फ़ंक्शन का उपयोग करते हैं। यह इंडेक्स में प्रभावित पंक्ति (कुंजी) तक सीधी पहुंच प्रदान करता है। एक बार जब वह पंक्ति (कुंजी) अनुक्रमणिका में स्थित हो जाती है, तो अनुक्रमणिका रिकॉर्ड में सीधे तालिका पंक्ति पर एक सूचक होता है जो क्वेरी में आवश्यक होता है। ये पॉइंटर्स इंडेक्स क्रिएशन और इंडेक्स मेंटेनेंस के दौरान स्थापित होते हैं। अनुक्रमणिका का उपयोग करते समय डेटा पुनर्प्राप्ति की गति परिमाण के क्रम से बढ़ जाती है।

अद्वितीय डेटाबेस इंडेक्स का एनाटॉमी

एक डेटाबेस तालिका में एक या अधिक संबद्ध अनुक्रमणिकाएँ हो सकती हैं। अनुक्रमणिका स्वयं तालिका में एक या अधिक स्तंभों से पंक्ति (कुंजी) मान रखती हैं। इसमें एक पॉइंटर भी होता है जो इन प्रमुख मानों वाली वास्तविक तालिका पंक्तियों की ओर इशारा करता है। किसी अनुक्रमणिका में दी गई कुंजी द्वारा इंगित पंक्तियों की संख्या इस बात पर निर्भर करती है कि अनुक्रमणिका एक अद्वितीय अनुक्रमणिका है या नहीं या एक गैर-अद्वितीय अनुक्रमणिका

जैसा कि नाम का तात्पर्य है, एक अद्वितीय अनुक्रमणिका में कुंजियाँ होती हैं जो किसी तालिका में केवल एक डेटा पंक्ति को इंगित करती हैं। अद्वितीय अनुक्रमणिका यह सुनिश्चित करती है कि तालिका की प्रत्येक पंक्ति में परिभाषित अनुक्रमित तालिका स्तंभों में अद्वितीय मान हों। प्रभावी रूप से, किसी भी दो पंक्तियों में अनुक्रमित स्तंभों में समान मान नहीं हो सकते हैं। इसके अलावा, उन स्तंभों पर अद्वितीय अनुक्रमणिकाएँ बनाई जाती हैं जिन्हें प्राथमिक कुंजी . के रूप में निर्दिष्ट किया जाता है मेज के लिए। प्राथमिक कुंजियों को एक या अधिक स्तंभों के रूप में परिभाषित किया जाता है जो विशिष्ट रूप से एक डेटाबेस तालिका में एक पंक्ति को परिभाषित करते हैं।

नीचे दिए गए उदाहरण प्रदर्शित करते हैं कि SQL में प्राथमिक कुंजी और अद्वितीय अनुक्रमणिका का उपयोग कैसे किया जाता है। सभी उदाहरण Student . नामक तालिका का उपयोग करते हैं , exampledb . नाम के एक उदाहरण डेटाबेस में . उदाहरण डेटा जोड़ने के लिए निम्न कमांड का उपयोग करें:

INSERT INTO Student(SSNumber, LastName, FirstName)
  VALUES
(111111111, Smith, John),
(222222222, Jones, Mary),
(333333333, Hansen, Robert);

Student . में संग्रहीत डेटा देखें तालिका:

SELECT * FROM Student;

आपको निम्न आउटपुट देखना चाहिए:

+-----------+----------+-----------+
| SSNumber  | LastName | FirstName |
+-----------+----------+-----------+
| 111111111 | Smith    | John      |
| 222222222 | Jones    | Mary      |
| 333333333 | Hansen   | Robert    |
+-----------+----------+-----------+
नोट जब तक अन्यथा उल्लेख न किया गया हो, इस गाइड के सभी कमांड MySQL . दोनों पर अच्छी तरह से काम करते हैं और PostgreSQL डेटाबेस।

एकल स्तंभ प्राथमिक कुंजी और अनुक्रमणिका

एक उदाहरण के रूप में, मान लें कि एक स्कूल Student . नामक तालिका में अपने छात्रों का ट्रैक रखता है . इस तालिका में Student . नामक कॉलम संबद्ध हैं , SSNumber , LastName , और FirstName . इन कॉलमों से, Student प्राथमिक कुंजी कॉलम है क्योंकि यह विशिष्ट रूप से Student . में डेटा की प्रत्येक पंक्ति की पहचान करता है टेबल। एक अद्वितीय अनुक्रमणिका बनाएं (SSIndex ) SSNumber . पर कॉलम, तालिका से डेटा की तेजी से पुनर्प्राप्ति की सुविधा के लिए। इस क्वेरी को करने के लिए निम्न SQL DDL कमांड का उपयोग किया जाता है:

क्रिएट टेबल स्टूडेंट (SSNumber CHAR(9) NOT NULL, LastName VARCHAR(30) NOT NULL, FirstName VARCHAR(20) NOT NULL, PRIMARY KEY (SSNumber));

CREATE UNIQUE INDEX SSIndex ON Student (SSNumber);
नोट उपरोक्त दोनों SQL कमांड अर्धविराम (;) द्वारा सीमांकित हैं, जो कि अधिकांश रिलेशनल डेटाबेस सिस्टम के साथ संगत है। SSNumber विशेष रूप से तालिका की प्राथमिक कुंजी के रूप में निर्दिष्ट है।

SSIndex केवल वही जानकारी होती है जो Student . की प्रत्येक पंक्ति में विशिष्ट रूप से डेटा की पहचान करती है टेबल। SSIndex . की प्रत्येक पंक्ति Student . में इसकी संगत पंक्ति के लिए एक सूचक है टेबल। यह SSIndex अनुक्रमणिका आपको तालिका में डेटा की क्रमिक खोज से बचने की अनुमति देती है जो क्वेरी के लिए आवश्यक समय को कम करके प्रदर्शन में सुधार करती है।

Robert Hansen के लिए संबंधित जानकारी ढूँढ़ने के लिए उनके SSNumber . के माध्यम से , नीचे शामिल SQL कमांड का उपयोग करें। आदेश न केवल Student . की अनुक्रमिक खोज को समाप्त करता है तालिका लेकिन SSIndex . का भी उपयोग करता है अपेक्षित डेटा पंक्ति तक सीधी पहुंच प्रदान करने के लिए। यह हैशिंग फ़ंक्शन और संबंधित इंडेक्स पॉइंटर का उपयोग करने के आधार पर है।

SELECT * FROM Student WHERE SSNumber = 333333333;

लौटाया गया डेटा निम्न होना चाहिए:

+-----------+----------+-----------+
| SSNumber  | LastName | FirstName |
+-----------+----------+-----------+
| 333333333 | Hansen   | Robert    |
+-----------+----------+-----------+

मल्टी-कॉलम कम्पोजिट प्राइमरी की और इंडेक्स

इस खंड के उदाहरण तीन तालिकाओं का उपयोग करते हैं जो एक टेनिस लीग से संबंधित डेटा संग्रहीत करते हैं। तीन टेबलों को Player . नाम दिया गया है , League , और Membership . एक खिलाड़ी कई लीगों में खेल सकता है, और सदस्यता तालिका उस जुड़ाव को प्रदान करती है। तीन तालिकाओं में उनके साथ जुड़े निम्नलिखित स्तंभ हैं:

Player . के कॉलम तालिका नीचे PlayedID . के साथ प्रदर्शित की गई है प्राथमिक कुंजी के रूप में।

+----------+-----------+-----------+
| PlayedID | LastName  | FirstName |
+----------+-----------+-----------+

League . के कॉलम तालिका नीचे LeagueId . के साथ प्रदर्शित की गई है प्राथमिक कुंजी के रूप में।

+----------+------------+------------+
| LeagueId | LeagueName | SkillLevel |
+----------+------------+------------+

Membership . के कॉलम तालिका नीचे प्रदर्शित की गई है

+----------+-----------+
| PlayedID | LeagueId  |
+----------+-----------+

नीचे दिए गए चरण आपको दिखाते हैं कि Player . कैसे बनाया जाता है , League , और Membership टेबल.

  1. Player . से तालिका, PlayedID कॉलम विशिष्ट रूप से डेटा की प्रत्येक पंक्ति की पहचान करता है। Player बनाएं PlayerId . पर एक अद्वितीय अनुक्रमणिका के बाद तालिका कॉलम।

     CREATE TABLE Player (
       PlayedID INT NOT NULL,
       LastName VARCHAR(30) NOT NULL,
       FirstName VARCHAR(20) NOT NULL,
       PRIMARY KEY (PlayedID)
     );
    
     CREATE UNIQUE INDEX PlayerIndex ON Player (PlayedID);
    
  2. League . से तालिका, LeagueId कॉलम विशिष्ट रूप से डेटा की प्रत्येक पंक्ति की पहचान करता है। League बनाएं तालिका के बाद LeagueId . पर एक अद्वितीय अनुक्रमणिका है कॉलम। इस ऑपरेशन को करने के लिए SQL कमांड निम्नलिखित है:

     CREATE TABLE League (
       LeagueId INT NOT NULL,
       LeagueName VARCHAR(50) NOT NULL,
       SkilLevel VARCHAR(20) NOT NULL,
       PRIMARY KEY (LeagueId)
     );
    
     CREATE UNIQUE INDEX LeagueIndex ON League (LeagueId);
    
  3. Membership . से तालिका, दोनों PlayedID और LeagueId कॉलम विशिष्ट रूप से डेटा की प्रत्येक पंक्ति की पहचान करते हैं; जो समग्र प्राथमिक कुंजी है। Membership बनाएं तालिका के बाद PlayedID . पर एक अद्वितीय समग्र अनुक्रमणिका है और LeagueId कॉलम।

     CREATE TABLE Membership (
       PlayerId INT NOT NULL,
       LeagueId INT NOT NULL,
       PRIMARY KEY(PlayerId, LeagueId)
     );
    
     CREATE UNIQUE INDEX MembershipIndex ON Membership (PlayerId, LeagueId);
    

MembershipIndex एक हैश-जनरेटेड इंडेक्स है जिसमें समग्र कुंजी (PlayedId . शामिल है) और LeagueId ) इसमें डेटा पंक्तियों के पॉइंटर्स हैं जो इसका प्रतिनिधित्व करते हैं। रैखिक अनुक्रमिक डेटा पुनर्प्राप्ति के विपरीत, इस तरह के एक सूचकांक का उपयोग तेजी से, प्रत्यक्ष-पहुंच डेटा पुनर्प्राप्ति की सुविधा प्रदान करता है। उदाहरण के लिए, उपरोक्त प्रत्येक तालिका में कई रिकॉर्ड से "मेन्स डबल्स" से जुड़े सभी खिलाड़ियों को निर्धारित करने के लिए, आप निम्न SQL कमांड जारी कर सकते हैं:

SELECT Player.LastName, Player.Firstname
FROM Player, Membership
WHERE Membership.LeagueId = 2
AND Membership.PlayerId = Player.PlayerId

निम्न डेटा लौटाया जाता है:

+----------+-----------+
| LastName | FirstName |
+----------+-----------+
| Smith    | John      |
| Hansen   | Robert    |
+-----------+----------+

MembershipIndex के उपयोग के बिना और PlayerIndex , ऊपर की क्वेरी काफी धीमी गति से निष्पादित होगी।

गैर-अद्वितीय अनुक्रमणिका

एक गैर-अद्वितीय अनुक्रमणिका में ऐसी प्रविष्टियाँ होती हैं जो किसी दिए गए कुंजी मान के लिए एक या अधिक पंक्तियों को इंगित कर सकती हैं। उदाहरण के लिए, किसी व्यक्ति के नाम से खोजने के लिए, तालिका पर FirstName दोनों के लिए एक गैर-अद्वितीय समग्र अनुक्रमणिका बनाना आवश्यक है और LastName . FirstName . के संयोजन के बाद से और LastName अद्वितीय होने की गारंटी नहीं दी जा सकती है, उन दो स्तंभों पर बनाई गई परिणामी अनुक्रमणिका प्रभावी रूप से एक गैर-अद्वितीय अनुक्रमणिका उत्पन्न करती है।

इंडेक्स का उपयोग करके डेटाबेस परफॉर्मेंस डिग्रेडेशन इश्यू

जबकि इंडेक्स क्वेरी निष्पादन गति में सहायता करते हैं, जब भी अनुक्रमित कॉलम बदलते हैं या डेटाबेस से टेबल पंक्तियों को जोड़ा या हटा दिया जाता है, तो उन्हें अपडेट करने की आवश्यकता होती है। यह डेटाबेस के प्रदर्शन के लिए हानिकारक हो सकता है। लेन-देन संबंधी डेटाबेस उपयोग के दौरान आपके अनुक्रमितों को सम्मिलित करने, हटाने और संशोधित करने की मात्रा को ध्यान में रखना महत्वपूर्ण है। विचार करें कि डेटाबेस अनुप्रयोग में आपके लिए क्या महत्वपूर्ण है; क्वेरी निष्पादन की गति या डेटा हेरफेर की गति। उस प्रश्न का उत्तर इस बात में निहित है कि डेटाबेस एप्लिकेशन का उपयोग कैसे किया जाता है, यह कितनी बार डेटाबेस के डिज़ाइन को प्रभावित करता है, और कितने इंडेक्स बनाए जाते हैं।

निष्कर्ष

डेटाबेस इंडेक्स बनाना और उपयोग करना तेजी से क्वेरी पुनर्प्राप्ति प्रतिक्रिया उत्पन्न करता है और तालिकाओं से अनुक्रमिक पंक्ति लुकअप को समाप्त करता है। हालांकि, डेटा हेरफेर के माध्यम से इंडेक्स रखरखाव डेटाबेस पर हानिकारक प्रदर्शन प्रभाव डाल सकता है। डेटाबेस डिजाइनरों को डेटाबेस इंडेक्स का उपयोग करते समय शामिल ट्रेड-ऑफ के बारे में पता होना चाहिए और समग्र डेटाबेस प्रदर्शन के लिए अनुकूलन को ध्यान में रखना चाहिए।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. त्रुटि कोड:1215. विदेशी कुंजी बाधा नहीं जोड़ सकता (विदेशी कुंजी)

  2. MySQL में TIMEDIFF () बनाम SUBTIME ():क्या अंतर है?

  3. संग्रहीत डेटा के अजीब वर्ण एन्कोडिंग, पुरानी लिपि उन्हें ठीक दिखा रही है नया नहीं है

  4. क्या MySQL के DESCRIBE [टेबल] के बराबर कोई SQLite है?

  5. Ansible . का उपयोग करके स्टैंडअलोन MySQL से गैलेरा क्लस्टर में माइग्रेशन को स्वचालित कैसे करें