2009-07-01 13 views
196

क्या आपको स्पष्ट रूप से एक अनुक्रमणिका बनाने की आवश्यकता है, या प्राथमिक कुंजी को परिभाषित करते समय यह अंतर्निहित है? क्या माईसाम और इनो डीबी के लिए इसका जवाब है?प्राथमिक कुंजी स्वचालित रूप से MySQL में अनुक्रमित है?

उत्तर

228

प्राथमिक कुंजी हमेशा अनुक्रमित होती है। यह MyISAM और InnoDB के लिए समान है, और आमतौर पर सभी स्टोरेज इंजनों के लिए सच है जो सभी समर्थन सूचकांक पर हैं।

+3

यदि प्राथमिक कुंजी हमेशा अनुक्रमित होती है तो डेटाबेस आर्किटेक्चर/प्रदर्शन के बारे में बात करते समय लोग हमेशा एसक्यूएल नवागंतुकों को सलाह देते हैं कि "सुनिश्चित करें कि उनका डेटाबेस ठीक से अनुक्रमित है"? –

+28

@tim: वे लोगों को यह सुनिश्चित करने के लिए कह रहे हैं कि फ़िल्टरिंग, ग्रुपिंग या सॉर्टिंग के लिए उपयोग किए जाने वाले किसी भी अन्य कॉलम में इंडेक्स भी हैं। –

+11

भी शामिल न भूलें! अनुक्रमित क्षेत्रों में फ़ील्ड की गति बढ़ जाती है। – JustJohn

8

आपको प्राथमिक कुंजी के लिए स्पष्ट रूप से एक अनुक्रमणिका बनाने की आवश्यकता नहीं है ... यह डिफ़ॉल्ट रूप से किया जाता है।

10

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

29

http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html के अनुसार यह जाहिर होता है कि इस निहित होगा

+1

मैंने प्रश्न पूछने से पहले खोज करके लिंक पाया। लेकिन ऐसा लगता है कि इस सवाल के बारे में मुझे कुछ और कुछ भी नहीं बताया गया है। –

+0

इस उत्तर में लिंक किया गया पृष्ठ इस बारे में कुछ भी नहीं कहता है कि प्राथमिक कुंजी भी एक सूचकांक है या नहीं। @fyrye से [answer] (https://stackoverflow.com/a/13979135/245602) में लिंक किए गए पृष्ठ अधिक प्रासंगिक हैं। –

12

हालांकि इस वर्ष 2009 में कहा गया था मैं प्राथमिक कुंजी पर MySQL प्रलेखन के लिए एक वास्तविक संदर्भ पोस्ट होता लगा। http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

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

के लिए MySQL 5.0 संदर्भ देखें: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

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

6

मुझे लगता है कि इस तरह के "द्वारा आदेश" के रूप में जवाब

mysql> create table test(id int primary key, s varchar(20)); 
Query OK, 0 rows affected (0.06 sec) 

mysql> show indexes from test \G 
*************************** 1. row *************************** 
     Table: test 
    Non_unique: 0 
    Key_name: PRIMARY 
Seq_in_index: 1 
    Column_name: id 
    Collation: A 
    Cardinality: 0 
    Sub_part: NULL 
     Packed: NULL 
     Null: 
    Index_type: BTREE 
     Comment: 
Index_comment: 
1 row in set (0.00 sec) 
2

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

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

  • इंडेक्स वास्तव में केवल उन तालिकाओं के साथ काम में आते हैं जिनमें बहुत सारी पंक्तियां होती हैं।

  • याद करने के लिए एक और बात यह है कि हमारे कर्मचारी के डेटाबेस के स्थिति में एक चोर है, कि यदि स्तंभ चर लंबाई, अनुक्रमित (और साथ MySQL के अधिकांश के रूप में) है बहुत कम कुशलता से प्रदर्शन करते हैं।

  • भी शामिल न भूलें! अनुक्रमित क्षेत्रों में फ़ील्ड की गति बढ़ जाती है।

1

प्राथमिक कुंजी हमेशा स्वचालित रूप से अनुक्रमित और अद्वितीय होती है। तो, अनावश्यक अनुक्रमणिका बनाने के लिए सावधान रहें।

उदाहरण के लिए, आप के रूप में इस तरह के

CREATE TABLE mytable (foo INT NOT NULL PRIMARY KEY, bar INT NOT NULL, baz INT NOT NULL, 
    UNIQUE(foo), INDEX(foo)) ENGINE=InnoDB; 

एक मेज बनाया है क्योंकि तुम सूचकांक करने के लिए प्राथमिक कुंजी चाहते हैं और उस पर एक विशिष्टता बाधा लागू करने, आप वास्तव में foo पर तीन अनुक्रमित बनाने में पहुंचते हैं!

संबंधित मुद्दे