বুলিয়ান ক্ষেত্রটি সূচকে কোনও কার্যকারিতা লাভ আছে কি?


102

আমি কেবল একটি কোয়েরি লিখতে চলেছি যার মধ্যে একটি রয়েছে WHERE isok=1। নামটি থেকে বোঝা যায়, isokএকটি বুলিয়ান ক্ষেত্র (আসলে TINYINT(1) UNSIGNEDএটি যা প্রয়োজন হিসাবে 0 বা 1 তে সেট করা হয়)।

এই ক্ষেত্রটি সূচকে কোনও কার্যকারিতা লাভ আছে কি? ইঞ্জিনটি (এই ক্ষেত্রে InnoDB) সূচকটি ভাল বা খারাপ দেখায়?


উত্তর:


79

আসলে তা না. আপনার এটি বইয়ের মতো চিন্তা করা উচিত। যদি কোনও বইয়ে কেবল তিন ধরণের শব্দ থাকে এবং আপনি সেগুলি সমস্ত সূচক করে থাকেন, আপনার সাধারণ পৃষ্ঠাগুলির মতো সূচী পৃষ্ঠাগুলির সমান সংখ্যা থাকবে।

একটি মানের তুলনামূলকভাবে কয়েকটি রেকর্ড থাকলে পারফরম্যান্স লাভ হবে। উদাহরণস্বরূপ, যদি আপনার 1000 টি রেকর্ড থাকে এবং এর মধ্যে 10 টি সত্য হয় তবে আপনি যদি অনুসন্ধান করে থাকেন তবে এটি কার্যকর হবেisok = 1

মাইকেল ডুরান্ট যেমন উল্লেখ করেছেন, এটি লেখাগুলিকে ধীর করে দেয়।

সম্পাদনা: সম্ভাব্য সদৃশ: বুলিয়ান ক্ষেত্রগুলি সূচীকরণ

এখানে এটি ব্যাখ্যা করে যে আপনার একটি সূচক থাকা সত্ত্বেও, আপনার যদি খুব বেশি রেকর্ড থাকে তবে তা সূচকটি কোনওভাবেই ব্যবহার করে না। মাইএসকিউএল = 1 পরীক্ষা করার সময় সূচক ব্যবহার করছে না, তবে এটি = 0 দিয়ে ব্যবহার করছে


4
দেখে মনে হচ্ছে "হ্যাঁ: 2 - না: 1"। কারও এখানে ভুল হয়েছে, কিন্তু কে?
নাইট দ্য ডার্ক অ্যাবসোল

4
এটি সম্পূর্ণ সঠিক নয়, কোনও সূচক ছাড়াই মাইএসকিউএলকে প্রাসঙ্গিক সারিগুলি সন্ধান করতে পুরো টেবিলটি স্ক্যান করতে হবে।
ilanco

4
অন্যথায় এটি পুরো সূচকটি স্ক্যান করবে। (যা বেশিরভাগ ক্ষেত্রে কেবল দীর্ঘ)
মাইকেল কোপার

1
এটি একটি পার্থক্য করতে পারে। কেবলমাত্র একটি সূচি যুক্ত করে প্রশ্নের প্রায় অর্ধেকের ফাঁসির সময়টি কাটা এবং লেখাগুলি বিরল এবং যথেষ্ট সস্তা যে আমরা সত্যিই শাস্তির বিষয়ে চিন্তা করি না। সবকিছুর মতো, অনুমান করবেন না, পরিমাপ করুন (কারণ কারণ ডেটাবেসগুলি সর্বদা আপনার মতো যুক্তিযুক্তভাবে প্রত্যাশা করতেন এমন আচরণ করে না)
Eelco

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

117

এখানে আরও বেশ কয়েকটি উত্তরের জন্য একটি সূক্ষ্ম বক্তব্য রাখার জন্য, যেহেতু আমার অভিজ্ঞতা অনুসারে, যারা এই জাতীয় প্রশ্নের দিকে তাকিয়ে থাকে তারা আমরা একই নৌকায় ছিলাম, আমরা সকলেই শুনেছি যে বুলিয়ান ক্ষেত্রগুলি নির্ধারণ করা অর্থহীন, এবং এখনও ...

আমাদের প্রায় 4 মিলিয়ন সারি সহ একটি টেবিল রয়েছে, কেবল একবারে 1000 বা তার বেশি সময়ে বুলিয়ান সুইচটি পতাকাঙ্কিত থাকে এবং এটি আমরা অনুসন্ধান করি search আমাদের বুলিয়ান ফিল্ডে সূচি যোগ করে প্রস্থের আদেশ অনুসারে ক্যারিগুলি আরও বেড়েছে, এটি প্রায় 9+ সেকেন্ড থেকে এক সেকেন্ডের ভগ্নাংশে চলে গেছে।


হ্যাঁ, আপনার অবশ্যই বিষয়গুলির 'কেন' বোঝার চেষ্টা করা উচিত, সর্বদা পাশাপাশি মাপুন এবং আপনার তত্ত্বটি ডিবি ইঞ্জিনের আসল আচরণের সাথে মেলে কিনা তা দেখার জন্য আপনার আসল ডেটাসেটে বিভিন্ন জিনিস চেষ্টা করে দেখুন (আপনি অবাক হবেন ... )
ইয়েলকো

8
@ ইলকো আপনি ঠিক বলেছেন, তবে এই ক্ষেত্রে ফলাফলটি মূল তত্ত্বের সাথে খুব ভাল মেলে। এটির তুচ্ছ হওয়া উচিত এমন প্রাথমিক ধারণাটি তখনই বোধগম্য হয় যদি আপনি প্রায় 50% আপনার অনুসন্ধানের সাথে মেলে এমন আইটেমগুলি নিয়ে আসেন। তারপরে, 100 টি মিল খুঁজে পেতে, ডিবিকে 200 টি আইটেম পুনরাবৃত্তি করতে হবে। তবে যদি আইটেমগুলি কেবল সময়ের 1% এর সাথে মেলে তবে এটির জন্য 10,000 টি আইটেম পুনরাবৃত্তি করা দরকার।
মাহেমফ

7
আমি পছন্দ করি যখন লোকেরা যখন মাঠে জিনিসগুলি চেষ্টা করে এবং কেবল দার্শনিকতার পরিবর্তে কর্মক্ষমতা লাভের প্রতিক্রিয়া দেয়।
ভিক্টর জোরাস

WHERE my_col > 0 পরিবর্তে my_col = 1গতিতে সহায়তা বলে মনে হচ্ছে
অ্যারন

27

এটি নির্ভর করে প্রকৃত ক্যোয়ারী এবং সূচী / ক্যোয়ারির সংমিশ্রণের নির্বাচনের উপর।

কেস এ : শর্ত WHERE isok = 1এবং সেখানে কিছুই নেই:

SELECT *
FROM tableX
WHERE isok = 1
  • যদি সূচকটি যথেষ্ট পরিমাণে বাছাই করে থাকে (বলুন যে আপনার কাছে 1M সারি রয়েছে এবং কেবল 1k রয়েছে isok = 1), তবে এসকিউএল ইঞ্জিন সম্ভবত সূচকটি ব্যবহার করবে এবং এটি ছাড়াই দ্রুততর হবে।

  • যদি সূচকটি যথেষ্ট পরিমাণে নির্বাচনী না হয় (বলুন যে আপনার 1M সারি রয়েছে এবং 100k এর বেশি রয়েছে isok = 1), তবে এসকিউএল ইঞ্জিন সম্ভবত সূচকটি ব্যবহার করবে না এবং কোনও টেবিল স্ক্যান করবে না।

কেস বি : শর্ত WHERE isok = 1এবং আরও স্টাফ:

SELECT *
FROM tableX
WHERE isok = 1
  AND another_column = 17

তারপরে, এটি আপনার অন্যান্য সূচকগুলির উপর নির্ভর করে। উপরের একটি সূচক another_columnসম্ভবত সূচকের চেয়ে বেশি নির্বাচনী হতে পারে isokযার উপর কেবল দুটি সম্ভাব্য মান রয়েছে। উপর একটি সূচক (another_column, isok)বা (isok, another_column)আরও ভাল হবে।


আমি মনে করি, এটি শীর্ষের সাথে তুলনায় এটি আরও সঠিক উত্তর। এছাড়াও তথ্য বিতরণ।
tyan

12

এটি ডেটা বিতরণের উপর নির্ভর করে।

কল্পনা করুন যে আমার কাছে 1000 টি ঘনিষ্ঠভাবে টাইপ করা পৃষ্ঠা রয়েছে এবং আমার বইয়ের একমাত্র শব্দগুলি হ্যাঁ 'এবং' না 'বারবার বারবার হয়েছে এবং এলোমেলোভাবে বিতরণ করা হয়েছে। যদি আমাকে 'হ্যাঁ' এর সমস্ত দৃষ্টান্তটি বৃত্তাকারে জিজ্ঞাসা করা হয়, তবে বইয়ের পিছনে কোনও সূচি সাহায্য করবে? এটা নির্ভর করে.

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

তবে যদি বলুন, আমার হাজার পৃষ্ঠাগুলির বইটিতে 'হ্যাঁ' এর দশটি উদাহরণ এবং সমস্ত কিছুই কেবল কয়েক মিলিয়ন না, তবে একটি সূচক 'হ্যাঁ' এর দশটি উদাহরণ খুঁজে পেতে এবং সেগুলিকে প্রদক্ষিণ করতে আমার অনেক সময় বাঁচাতে পারে ।

এটি ডাটাবেসে একই। যদি এটি একটি 50:50 বিতরণ হয়, তবে কোনও সূচক সাহায্য করবে না - ডাটাবেস ইঞ্জিনটি শুরু থেকে শেষের (সম্পূর্ণ টেবিল স্ক্যান) উপাত্ত দিয়ে হালকা জোড় করা ভাল, এবং সূচকটি কেবল ডাটাবেসকে আরও বড় করে তুলবে, এবং লিখতে এবং আপডেট করতে ধীর। তবে এটি যদি 4000: 1 বিতরণের মতো হয় ( এই থ্রেডে আউসিল অনুসারে ), তবে কোনও সূচক সন্ধানটি এটির গতি বাড়িয়ে তুলতে পারে, যদি এটি 4000 আইটেমগুলির মধ্যে আপনি 1 খুঁজছেন।


5

না, সাধারণত না।

আপনি সাধারণত ক্ষেত্রগুলিকে অনুসন্ধানের জন্য সূচী করেন যখন তাদের উচ্চ নির্বাচনের / কার্ডিনালিটি থাকে। বেশিরভাগ সারণীতে একটি বুলিয়ান ক্ষেত্রের কার্ডিনালিটি খুব কম। এটি আপনার লেখাগুলিকে ভগ্নাংশের চেয়ে ধীর করে তুলবে।


3

আসলে এটি আপনার চালানো প্রশ্নের উপর নির্ভর করে। তবে, সাধারণত হ্যাঁ, পাশাপাশি অন্য কোনও ধরণের ক্ষেত্র সূচীকরণ।


2

হ্যাঁ একটি সূচক কর্মক্ষমতা উন্নত করবে, সূচকটি ছাড়াই এবং ছাড়াই এক্সপ্ল্লেইনের আউটপুট পরীক্ষা করে।

ডক্স থেকে:

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

আমি মনে করি এটি নিরাপদে বলাও নিরাপদ যে কোনও ক্ষেত্রে এই ক্ষেত্রে পারফরম্যান্সকে হ্রাস করবে না , সুতরাং আপনার কেবল এটি থেকে লাভ করতে হবে।


2
একটি সূচক হার্ডডিস্কে প্রচুর ডেটা দেয় এবং এটি লেখাকে ধীর করে দেয় যাতে আপনি কেবল এটি থেকে লাভ করবেন না।
মাইকেল কোপার

1
সত্য, তবে এই ক্ষেত্রে, একটি TINYINT(1) UNSIGNEDকলাম, ডেটার আকার ছোট হবে।
ilanco

এবং যোগ লিখিত ওভারহেড সম্ভবত বেশ কম
Eelco

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