রেলের কোনও টেবিলে কখন সূচকগুলি যুক্ত করবেন


131

আমার কাছে রেলস ডাটাবেস সম্পর্কে একটি প্রশ্ন আছে।

  • "এক্সএক্সএক্সএক্স_আইডি" এর মতো বিদেশী কীগুলিতে কি আমাকে "সূচক" যুক্ত করা উচিত?
  • আমি কি স্বয়ংক্রিয়ভাবে তৈরি "আইডি" কলামে "সূচক" যুক্ত করব?
  • আমাকে স্বয়ংক্রিয়ভাবে তৈরি "আইডি" কলামে "সূচক (অনন্য)" যুক্ত করা উচিত?

  • যদি আমি একবারে দুটি বিদেশী কীতে সূচক যুক্ত করি (তবে 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

"এক্সএক্সএক্সএক্স_আইডি" এর মতো বিদেশী কীগুলিতে কি আমাকে "সূচক" যুক্ত করা উচিত?

এটি আরও ভাল হবে, কারণ এটি এই কলামে বাছাইয়ের ক্ষেত্রে অনুসন্ধানকে ত্বরান্বিত করে। এবং বিদেশী কীগুলি এমন অনেক কিছু যা অনুসন্ধান করা হয়।

রেল সংস্করণের 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 এর জন্য আমার "অনন্য সহ সূচক" যুক্ত করা উচিত, তাই না?
টি।

প্রশ্ন, যদি ক্ষেত্রটি খুব কমই স্পষ্টভাবে অনুসন্ধান করা হয় তবে আপনি কি কোনও বিদেশী কী সূচী করবেন?
Noz

@ কাইল আমি এটির উত্তর অবশ্যই দিতে পারছি না, এটি আপনার মেশিন, ডাটাবেসের আকার এবং আপনার প্রশ্নের প্রকৃতির উপর নির্ভর করে depends যদি কোয়েরিটি ওয়েব থেকে আসে তবে আমি সম্ভবত হ্যাঁ বলব, কারণ এটি দ্রুত প্রতিক্রিয়া পাওয়া সর্বদা ভাল, যদি এটি ব্যাকগ্রাউন্ড কাজের জন্য হয় এবং আপনাকে ডিস্কের স্থানটি সংরক্ষণ করার দরকার হয় তবে ডিস্কের স্পেস থাকলে কোনও সমস্যা নয় আমি যাইহোক একটি সূচি যুক্ত করব।
জিগফক্স

111

সূচকগুলি একটি কৌতুকপূর্ণ, সূক্ষ্ম জিনিস হতে পারে, তবে এমন সাধারণ নিয়ম রয়েছে যা প্রয়োগ করে যা অনেক বেশি সহজ ব্যবহার করতে হবে তা নির্ধারণ করতে পারে।

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

এই বিষয়টি মনে রেখে, এমন অনেকগুলি বিষয় রয়েছে যা আপনি কীভাবে সূচকগুলি তৈরি করবেন তা নির্দেশ করবে:

  • আপনার যদি একটি 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/ using-indexes-in-rails-choosing-additional-indexes , Rails - created_at যখন অর্ডার দেওয়ার জন্য ব্যবহারকারী, আপনি কি টেবিলে একটি সূচি যুক্ত করবেন? , এবং উপরের উত্তরগুলি।

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