रेल्स में तालिका में क्या अनुक्रमणिका जोड़ने के लिए


131

मेरे पास Rails डेटाबेस के बारे में एक प्रश्न है।

  • क्या मुझे "xxx_id" जैसी सभी विदेशी कुंजियों में "इंडेक्स" जोड़ना चाहिए?
  • क्या मुझे स्वचालित रूप से बनाए गए "आईडी" कॉलम में "इंडेक्स" जोड़ना चाहिए?
  • क्या मुझे स्वचालित रूप से बनाए गए "आईडी" कॉलम में "इंडेक्स (अद्वितीय)" जोड़ना चाहिए?

  • यदि मैं एक बार में दो विदेशी कुंजियों में सूचकांक जोड़ता हूं (तो add_index (:users, [:category, :state_id]), क्या होता है? यह प्रत्येक कुंजी के लिए सूचकांक को जोड़ने से कैसे अलग है?

    class CreateUsers < ActiveRecord::Migration
      def self.up
        create_table :users do |t|
          t.string :name
          t.integer :category_id 
          t.integer :state_id
          t.string :email
          t.boolean :activated
          t.timestamps
        end
      # Do I need this? Is it meaningless to add the index to the primary key?
      # If so, do I need :unique => true ?
      add_index :users, :id 
      # I don't think I need ":unique => true here", right?
      add_index :users, :category_id # Should I need this?
      add_index :users, :state_id # Should I need this?
      # Are the above the same as the following?
      add_index (:users, [:category, :state_id])
      end
    end

अब तक का शानदार जवाब। अतिरिक्त प्रश्न।

  • मुझे xxx_id के लिए "अद्वितीय के साथ अनुक्रमणिका" जोड़ना चाहिए, है ना?

जवाबों:


175

क्या मुझे "xxx_id" जैसी सभी विदेशी कुंजियों में "इंडेक्स" जोड़ना चाहिए?

यह बेहतर होगा, क्योंकि यह इस कॉलम में छँटाई में खोज को तेज करता है। और विदेशी चाबियां बहुत कुछ खोज की जाती हैं।

चूंकि रेल के संस्करण 5 में सूचकांक स्वचालित रूप से बनाया जाएगा, इसलिए अधिक जानकारी के लिए यहां देखें ।

क्या मुझे स्वचालित रूप से बनाए गए "आईडी" कॉलम में "इंडेक्स" जोड़ना चाहिए?

नहीं, यह पहले से ही रेल द्वारा किया जाता है

क्या मुझे स्वचालित रूप से बनाए गए "आईडी" कॉलम में "इंडेक्स (अद्वितीय)" जोड़ना चाहिए?

नहीं, ऊपर जैसा

यदि मैं एक बार में दो विदेशी कुंजियों में सूचकांक जोड़ता हूं (तो add_index (:users, [:category_id, :state_id]), क्या होता है? यह प्रत्येक कुंजी के लिए सूचकांक को जोड़ने से कैसे अलग है?

फिर सूचकांक दो कॉलम का संयुक्त सूचकांक है। इसका कोई मतलब नहीं है, जब तक आप एक ही समय में एक category_id और एक state_id(यह category_idनहीं होना चाहिए category) के लिए सभी प्रविष्टियां चाहते हैं ।

इस तरह एक सूचकांक निम्नलिखित अनुरोध को गति देगा:

# rails 2
User.find(:all, :conditions => { :state_id => some_id, :category_id => some_other_id })

# rails 3
User.where(:state_id => some_id, :category_id => some_other_id)

कहाँ पे

add_index :users, :category_id
add_index :users, :state_id

इन अनुरोधों को गति देगा:

# rails 2+3
User.find_by_category_id(some_id)
User.find_by_state_id(some_other_id)

# or
# rails 2
User.find(:all, :conditions => {:category_id => some_id})
User.find(:all, :conditions => {:state_id => some_other_id})

# rails 3
User.where(:category_id => some_id)
User.where(:state_id => some_other_id)

मुझे xxx_id के लिए "अद्वितीय के साथ अनुक्रमणिका" जोड़ना चाहिए, है ना?

नहीं, क्योंकि अगर आप ऐसा करते हैं, केवल एक उपयोगकर्ता एक वर्ग में हो सकता है, लेकिन श्रेणी का अर्थ है कि आप अधिक डाल सकते हैं कई एक श्रेणी में उपयोगकर्ता। आपके Userमॉडल में आपके पास ऐसा कुछ है belongs_to :categoryऔर आपके श्रेणी मॉडल में कुछ ऐसा है has_many :users। यदि आपके पास एक has_manyरिश्ता है तो foreign_keyक्षेत्र अद्वितीय नहीं होना चाहिए!

इस पर अधिक विस्तृत जानकारी के लिए आपको टैडमैन के शानदार उत्तर पर एक नज़र डालनी चाहिए ।


3
बहुत बढ़िया जवाब। अतिरिक्त प्रश्न। मुझे xxx_id के लिए "अनन्य के साथ अनुक्रमणिका" जोड़ना चाहिए, है ना?
टी.के.

यदि आप उस क्षेत्र को बहुत कम ही स्पष्ट रूप से खोजते हैं, तो क्या आप एक विदेशी कुंजी को अनुक्रमित करेंगे?
नोज़

@ काइल मैं निश्चित रूप से इसका जवाब नहीं दे सकता, यह आपकी मशीन, डेटाबेस के आकार और आपकी क्वेरी की प्रकृति पर निर्भर करता है। यदि क्वेरी वेब से आती है, तो मैं शायद हां कहूंगा, क्योंकि यह तेजी से प्रतिक्रियाएं प्राप्त करने के लिए हमेशा बेहतर होता है, यदि यह एक पृष्ठभूमि नौकरी के लिए है और आपको डिस्क स्थान को बचाने की आवश्यकता है, तो आपको इसे सेट करने की आवश्यकता नहीं है, लेकिन यदि डिस्क स्थान कोई समस्या नहीं है मैं वैसे भी एक सूचकांक जोड़ूंगा।
जिगफॉक्स

111

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

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

इस बात को ध्यान में रखते हुए, ऐसी कई चीजें हैं जो यह बताएंगी कि आप कैसे इंडेक्स बनाते हैं:

  • यदि आपके पास एक belongs_to- has_manyसंबंध पेयरिंग है, तो आपको उपयोग की जाने वाली विदेशी कुंजी पर एक इंडेक्स की आवश्यकता होती है।
  • यदि आप अपने रिकॉर्ड का आदेश देते हैं, और उनमें से एक बड़ी संख्या है जो कि पृष्ठबद्ध हो जाएगी, तो आपको सूचकांक के अंत में उस आदेश कॉलम को जोड़ना चाहिए।
  • यदि आपका कोई has_many :throughसंबंध है, तो आपकी ज्वाइन टेबल में कंपाउंड की के रूप में शामिल होने वाले दोनों गुणों पर एक अद्वितीय सूचकांक होना चाहिए।
  • यदि आप किसी विशिष्ट पहचानकर्ता जैसे कि उपयोगकर्ता नाम या ईमेल का उपयोग करके सीधे एक रिकॉर्ड प्राप्त करते हैं, तो यह एक अद्वितीय सूचकांक होना चाहिए।
  • यदि आप has_manyकिसी दायरे का उपयोग करके किसी रिश्ते से रिकॉर्ड के सेट प्राप्त करते हैं, तो सुनिश्चित करें कि एक सूचकांक है जिसमें has_manyविदेशी कुंजी और उस क्रम में गुंजाइश कॉलम शामिल है।

अनुक्रमित के साथ लक्ष्य खतरनाक "टेबल स्कैन" या "फ़ाइल सॉर्ट" संचालन को समाप्त करना है जो तब होता है जब आपका डेटा ठीक से अनुक्रमित नहीं होता है।

सरल शब्दों में, अपने एप्लिकेशन द्वारा उत्पन्न किए जा रहे प्रश्नों को देखें और यह सुनिश्चित करें कि उस क्रम में WHEREया HAVINGशर्तों और ORDER BYखंडों में संदर्भित कॉलम का प्रतिनिधित्व किया गया है।


1
मैं उत्सुक हूं कि यदि आप हमेशा उन्हें हर विदेशी कुंजी के लिए उपयोग करना चाहते हैं तो रेल्स इंडेक्स का मतलब नहीं है। क्या ऐसी स्थिति है जहां इसे इंडेक्स करना अच्छा नहीं है?
ट्रिप

1
@ index: trueसरल मामलों के लिए अपने कॉलम की परिभाषा में जोड़ना बहुत आसान है , लेकिन कभी-कभी आप इस पर अधिक नियंत्रण चाहते हैं। विदेशी कुंजियों पर डिफ़ॉल्ट रूप से अनुक्रमित होने के लिए एक भयानक डिफ़ॉल्ट नहीं है, लेकिन यह लोगों को आश्चर्यचकित कर सकता है।
tadman

13
  • हमेशा विदेशी कुंजी अनुक्रमित करें
  • हमेशा आपके द्वारा ऑर्डर किए जाने वाले कॉलम को अनुक्रमित किया जाएगा
  • सभी अनन्य फ़ील्ड (एक डेटाबेस स्तर पर विशिष्टता सुनिश्चित करने के लिए उदाहरण माइग्रेशन:। add_index :users, :email, unique: true)
  • यदि आप दो चीजों से ऑर्डर करते हैं, या दो चीजों से खोज करते हैं, उदाहरण के लिए: order by [a, b]या find where( a and b ), तो आपको एक दोहरे सूचकांक की आवश्यकता है:

ठोस उदाहरण:

यदि आपके पास है:

default_scope :order => 'photos.created_at DESC, photos.version DESC'

आपको जोड़ना चाहिए:

add_index :photos, [:created_at, :version]

नोट: एक सूचकांक डिस्क पर अतिरिक्त स्थान लेता है और प्रत्येक रिकॉर्ड बनाने और अद्यतन करने के लिए इसे धीमा कर देता है, क्योंकि इसे प्रत्येक सूचकांक का पुनर्निर्माण करना है।

क्रेडिट:

https://tomafro.net/2009/08/08/using-indexes-in-rails-choosing-additional-indexes , पटरियों - जब उपयोगकर्ता आदेश देने के लिए बनाया, तो क्या आपको तालिका में एक सूचकांक जोड़ना चाहिए? , और उपरोक्त उत्तर।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.