Database Indexing
Database indexing is a technique used to optimize the performance of database queries by allowing the database management system (DBMS) to quickly locate and retrieve specific rows of data. Indexes are data structures that provide a faster way to look up records based on the values stored in one or more columns of a table. When you create an index on a table, the DBMS creates a separate data structure that maps the values in the indexed columns to the corresponding rows in the table. Default Type of Index is B-Tree Index ( The king of all indexes)
বইতে কোন টপিক খুজতে গেলে আমরা টেবিল অফ কনটেন্ট থেকে দেখি এই টপিক কত নম্বর পেজে আছে।যাতে করে আমাদের পুরো বই খুজতে না হয়। ডেটাবেজ ইনডেক্সিং ও তেমনই একটা ইফিসিয়েন্ট টেকনিক।ডেটাবেজে কোন ডেটাকে দ্রুত খুজে বের করার জন্য ইনডেক্সিং করা লাগে।যদি এমন হয় একটা কুয়েরি বার বার এক্সিকিউট করতে হচ্ছে এবং একটা কলাম থেকে ভ্যালু বার বার খুজতে হচ্ছে তখন আমরা সেই কলামে ইনডেক্সিং করতে পারি।এর মাধ্যমে কোন ডেটা দ্রুত রিট্রাইভ করা যায়।কিন্তু ইন্টার্নালি কাজটা কিভাবে হয়?যখন আমরা ইনডেক্স ক্রিয়েট করি তখন ইন্টার্নালি সেই কলামের সবগুলা ডেটা আলাদা একটা ফাইলে রাখা হয়।এবং সেই ডেটা গুলা B-Tree ডেটা স্ট্রাকচার অনুযায়ী সাজানো হয়।B-Tree হলো বাইনারি সার্চ ট্রি এর মতই তবে কিছুটা এডভান্স।এই ট্রি এর লিফ সবসময় সেম লেভেলে থাকে এবং ট্রি সবসময় সেল্ফ ব্যালেন্স মেইনটেইন করে।বাইনারি সার্চ ট্রি তে একটা নোডে একটাই Key থাকে।কিন্তু এখানে একাধিক Key থাকে।এবং Key গুলা এসেন্ডিং অর্ডারে সাজানো থাকে।যার ফলে দ্রুত কোন ডেটা এখান থেকে রিট্রাইভ করা সম্ভব হয়।তবে অপ্রয়োজনী ইনডেক্সিং করলে ইফিসিয়েন্সি কমে আসে কারণ ইনডেক্সিং এর জন্য এক্সট্রা মেমোরি দরকার হয়।এছাড়া যেসব অপারেশনে রিড বেশি হয় সেখানে ইনডেক্সিং ভালো কাজ করে।কিন্তু আপডেট বা ইনসার্ট অপারেশন ইনডেক্সিং এর জন্য স্লো কাজ করে।
আমি ৫০ হাজার রো এর একটা ডেটাবেজে ইনডেক্সিং করে টেস্ট করলাম।রেসপন্স আসছে ৫০ মিলি সেকেন্ডে।আর ইনডেক্সিং ছাড়া অলমোস্ট ২০০ মিলি সেকেন্ড প্লাস।তার মানে আমরা টাইম লিমিট ৪ গুন কমাতে পারছি
B-Tree Index
# How does a B-Tree index work?
B-tree index is the most common in use. It achieves its goal by creating a tree structure of blocks containing key values in ascending order. Each of these blocks references another two child blocks, where left side keys keep value lesser than the current keys and the right side ones are more than the current keys. This way seeking values inside an index comes up to simple comparison calculations. B-tree can also handle equality and range queries on data that can be sorted into an ordering.
1. suppose you have these values: 1 2 3 4 5 6 7 8 9
2. Now B-Tree index will create a tree as blow. Index Root and Leaf blocks
3. Now Search for the value 5
1. Now it'll Scan the index root
2. Find the leaf block
This is our model. Here we didn't apply any indexing in this model. If we want to get value using movie_key field filtering , It’s clear that PostgreSQL will decide to use sequential scan to retrieve the item, which simply means that it had to scan all table rows to finish its action. This practice has a clear impact on execution time value. Therefore, to improve the performance of the API, we should use an index on the movie_key field. Thanks to Django, we can make this change directly in our model by applying db_index=True in the desired field. After running the database migrations and sending the request once again, we can see the change in the executed query.
Surprisingly though, there is a way to optimize this query even more, allowing the database to skip the part of searching the table at all. This is achievable using a covering/inclusive index.
Covering / Inclusive Indexes
They are useful when performing “value-for-value” lookups, which means retrieving one column value in the table based on another one. The index can be set up in the Meta class of our model. Additional field value is added in the include parameter of the UniqueConstraint index
for this query where Movie is the model :
Movie.objects.filter(movie_key=movie_key).values_list('original_title',flat=True).get()
SELECT original_title FROM movie WHERE movie_key='Kjrkdj'
Cons:
1. Make index much bigger
2. Can sometimes replace composite indexes ( which are include lot of columns)
Comments
Post a Comment