বইয়ের শেষে থাকা ইনডেক্স যেমন কোনো টপিক দ্রুত খুঁজে পেতে সাহায্য করে, ডাটাবেসের ইনডেক্সও ঠিক তেমনই কাজ করে – এটি টেবিলের ডেটার মধ্যে দ্রুত সার্চ করার একটি বিশেষ ব্যবস্থা। ইনডেক্স সঠিকভাবে ব্যবহার করলে SELECT কোয়েরির গতি কয়েকগুণ বেড়ে যেতে পারে, বিশেষ করে বড় টেবিলে। তবে এর বিনিময়ে INSERT, UPDATE, DELETE-এ সামান্য ধীরগতি আসে। আজ আমরা SQLite-তে কীভাবে ইনডেক্স তৈরি করতে হয়, বিভিন্ন ধরনের ইনডেক্স (একক কলাম, ইউনিক, কম্পোজিট), ইনডেক্স তালিকা দেখা, মুছে ফেলা এবং কখন ইনডেক্স ব্যবহার করা উচিত নয় – সবকিছু বিস্তারিত উদাহরণসহ শিখব।
পূর্বপ্রস্তুতি
- SQLite ইন্সটল থাকতে হবে (সিরিজের ৩য় পর্ব দেখুন)।
- আমাদের পরিচিত
COMPANYটেবিল ব্যবহার করব।indexes_demo.dbনামে ডাটাবেস প্রস্তুত করি।
টার্মিনাল:
bash
sqlite3 indexes_demo.db
sql
CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL ); INSERT INTO COMPANY VALUES (1, 'Paul', 32, 'California', 20000.00); INSERT INTO COMPANY VALUES (2, 'Allen', 25, 'Texas', 15000.00); INSERT INTO COMPANY VALUES (3, 'Teddy', 23, 'Norway', 20000.00); INSERT INTO COMPANY VALUES (4, 'Mark', 25, 'Rich-Mond', 65000.00); INSERT INTO COMPANY VALUES (5, 'David', 27, 'Texas', 85000.00); INSERT INTO COMPANY VALUES (6, 'Kim', 22, 'South-Hall', 45000.00); INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00);
- আউটপুট ফরম্যাট:
.header on,.mode column।
১. ইনডেক্স কী এবং কেন প্রয়োজন?
ইনডেক্স হলো টেবিলের এক বা একাধিক কলামের উপর তৈরি একটি বিশেষ ডেটা স্ট্রাকচার (সাধারণত B-tree), যা ডাটাবেস ইঞ্জিনকে সম্পূর্ণ টেবিল স্ক্যান না করে সরাসরি প্রাসঙ্গিক সারিতে পৌঁছাতে সাহায্য করে।
উপকারিতা:
SELECTওWHEREক্লজের গতি বাড়ায়।ORDER BYওGROUP BYঅপারেশনে দ্রুত সাজাতে পারে।
অপকারিতা:
- প্রতিবার
INSERT,UPDATE,DELETE-এর সময় ইনডেক্স আপডেট করতে হয়, যা লেখার গতি কিছুটা কমায়। - ডাটাবেস ফাইলের আকার বাড়ে।
২. CREATE INDEX – সাধারণ একক-কলাম ইনডেক্স
একটি কলামের উপর ইনডেক্স তৈরি করতে:
সিনট্যাক্স:
sql
CREATE INDEX index_name ON table_name (column_name);
উদাহরণ: COMPANY টেবিলের SALARY কলামে ইনডেক্স তৈরি করি, যাতে বেতন অনুযায়ী দ্রুত খোঁজা যায়।
sql
CREATE INDEX salary_index ON COMPANY (SALARY);
এখন যখন আমরা SELECT * FROM COMPANY WHERE SALARY > 50000; চালাব, SQLite এই ইনডেক্স ব্যবহার করে দ্রুত ফলাফল দিতে পারবে।
ইনডেক্সের তালিকা দেখা:
sql
.indices COMPANY
আউটপুট:
text
salary_index sqlite_autoindex_COMPANY_1
এখানে sqlite_autoindex_COMPANY_1 হলো ইমপ্লিসিট ইনডেক্স, যা প্রাইমারি কি-র জন্য স্বয়ংক্রিয়ভাবে তৈরি হয়েছে।
ডাটাবেসের সব ইনডেক্স দেখতে:
sql
SELECT * FROM sqlite_master WHERE type = 'index';
৩. UNIQUE INDEX – ইউনিক ইনডেক্স
ইউনিক ইনডেক্স শুধু পারফরম্যান্সই বাড়ায় না, বরং ডেটা ইন্টিগ্রিটিও নিশ্চিত করে – এটি নিশ্চিত করে যে ওই কলামে কোনো ডুপ্লিকেট মান ঢুকতে পারবে না।
সিনট্যাক্স:
sql
CREATE UNIQUE INDEX index_name ON table_name (column_name);
উদাহরণ: NAME কলামে ইউনিক ইনডেক্স তৈরি করি (যদিও বাস্তবে একই নাম একাধিকবার থাকতে পারে, উদাহরণ হিসেবে দেখানো হলো):
sql
CREATE UNIQUE INDEX name_unique_idx ON COMPANY (NAME);
এখন যদি দ্বিতীয়বার INSERT INTO COMPANY ... NAME='Paul' দিই, তাহলে UNIQUE constraint failed এরর আসবে।
৪. COMPOSITE INDEX – যৌগিক ইনডেক্স
যৌগিক ইনডেক্স একাধিক কলামের সমন্বয়ে তৈরি হয়। যখন আপনার WHERE ক্লজে প্রায়ই একাধিক কলাম একসাথে ফিল্টার হিসেবে ব্যবহৃত হয়, তখন কম্পোজিট ইনডেক্স সবচেয়ে কার্যকর।
সিনট্যাক্স:
sql
CREATE INDEX index_name ON table_name (column1, column2);
উদাহরণ: AGE এবং SALARY-র উপর একটি কম্পোজিট ইনডেক্স তৈরি করি:
sql
CREATE INDEX age_salary_idx ON COMPANY (AGE, SALARY);
এটি বিশেষভাবে কাজে আসবে যখন আপনি WHERE AGE > 25 AND SALARY > 30000 ধরনের কোয়েরি চালাবেন।
মনে রাখবেন: কলামের ক্রম গুরুত্বপূর্ণ। উপরের ইনডেক্স WHERE AGE = 25-এ কাজ করবে, কিন্তু শুধু WHERE SALARY = 20000-তে পুরোপুরি কার্যকর নাও হতে পারে।
৫. ইমপ্লিসিট ইনডেক্স (Implicit Indexes)
SQLite স্বয়ংক্রিয়ভাবে PRIMARY KEY এবং UNIQUE কনস্ট্রেইন্টযুক্ত কলামের জন্য ইনডেক্স তৈরি করে। এগুলোকে ইমপ্লিসিট ইনডেক্স বলে। যেমন আমাদের COMPANY টেবিলের ID প্রাইমারি কি, তাই sqlite_autoindex_COMPANY_1 নামে একটি ইনডেক্স অটো-ক্রিয়েট হয়েছে। এই ইনডেক্স সরাসরি ডিলিট করা যায় না।
৬. DROP INDEX – ইনডেক্স মুছে ফেলা
যখন কোনো ইনডেক্স আর প্রয়োজন নেই, তখন তা মুছে ফেলা ভালো, কারণ এটি লেখার গতি বাড়াতে সাহায্য করে এবং ডিস্ক স্পেস বাঁচায়।
সিনট্যাক্স:
sql
DROP INDEX index_name;
উদাহরণ: পূর্বে তৈরি salary_index মুছে ফেলি:
sql
DROP INDEX salary_index;
এখন .indices COMPANY দিলে এটি আর তালিকায় থাকবে না।
সতর্কতা: ইমপ্লিসিট ইনডেক্স (sqlite_autoindex_*) ড্রপ করা যায় না।
৭. কখন ইনডেক্স ব্যবহার করা উচিত নয়?
ইনডেক্স সবসময় উপকারী নয়। নিচের পরিস্থিতিগুলোতে ইনডেক্স এড়িয়ে চলা উচিত:
- ছোট টেবিল: যেখানে মাত্র কয়েকটি সারি আছে, সেখানে সম্পূর্ণ টেবিল স্ক্যান করাই দ্রুত হয়।
- ঘন ঘন বড় আকারের আপডেট/ইনসার্ট: যে টেবিলে প্রতি মুহূর্তে প্রচুর ডেটা ঢোকে বা বদলায়, ইনডেক্স রক্ষণাবেক্ষণই ধীরগতির কারণ হয়ে দাঁড়ায়।
- অনেক NULL মান আছে এমন কলাম: যে কলামে বেশিরভাগ মান NULL, সেখানে ইনডেক্স তেমন সুবিধা দেয় না।
- যে কলামের মান প্রায়ই পরিবর্তিত হয়: ঘন ঘন আপডেট হওয়া কলামে ইনডেক্স মেইনটেনেন্স বেশি খরুচে।
৮. ডিরেক্টরি স্ট্রাকচার ও প্যাকেজ
শুধুমাত্র indexes_demo.db ফাইলটি ব্যবহৃত হচ্ছে। কোনো অতিরিক্ত প্যাকেজ ইন্সটল করতে হবে না।
text
project-folder/ └── indexes_demo.db
৯. গুরুত্বপূর্ণ টিপস
- EXPLAIN QUERY PLAN ব্যবহার করুন: কোয়েরির আগে
EXPLAIN QUERY PLAN SELECT ...লিখে দেখতে পারেন SQLite আসলে আপনার তৈরি ইনডেক্স ব্যবহার করছে কিনা। - প্রয়োজনীয় কলামেই ইনডেক্স দিন: যে কলামগুলো WHERE, JOIN, ORDER BY, GROUP BY-তে প্রায়ই ব্যবহার করেন, সেগুলোতে ইনডেক্স দিন।
- প্রাইমারি কি যথেষ্ট: প্রাইমারি কি-র কলামে আলাদা করে ইনডেক্স দেওয়ার দরকার নেই, কারণ ইমপ্লিসিট ইনডেক্স আগে থেকেই আছে।
- ব্যালেন্স রক্ষা করুন: বেশি বেশি ইনডেক্স SELECT-এর গতি বাড়ালেও INSERT/UPDATE/DELETE-কে ধীর করে। বাস্তব প্রয়োজন বুঝে ইনডেক্স তৈরি করুন।
- ইনডেক্সের আকার: বড় ইনডেক্স মেমোরিতে ফিট না হলে ডিস্ক I/O বাড়তে পারে। cache_size PRAGMA বাড়িয়ে সহায়তা পাওয়া যেতে পারে।
১০. সম্পূর্ণ অনুশীলন সেশন
sql
.headers on .mode column -- ইনডেক্স তৈরি CREATE INDEX age_idx ON COMPANY (AGE); CREATE INDEX name_salary_idx ON COMPANY (NAME, SALARY); -- ইনডেক্স তালিকা দেখি .indices COMPANY -- কোয়েরি প্ল্যান দেখি EXPLAIN QUERY PLAN SELECT * FROM COMPANY WHERE AGE > 25; -- ইউনিক ইনডেক্স (NAME-তে ডুপ্লিকেট থাকায় আগে বাদ দিন বা নতুন টেবিল বানিয়ে পরীক্ষা করুন) -- CREATE UNIQUE INDEX unique_name ON COMPANY (NAME); -- এরর দেবে, কারণ Paul/James ডুপ্লিকেট নেই? বর্তমানে সবাই ইউনিক আছে, তবে আগে থেকে একাধিক Paul থাকলে এরর হবে। -- ইনডেক্স ড্রপ DROP INDEX age_idx; -- ইনডেক্স মাস্টার টেবিল থেকে দেখা SELECT name, tbl_name FROM sqlite_master WHERE type = 'index';
পরবর্তী পর্বে
আমরা শিখব SQLite ALTER TABLE – টেবিলের গঠন পরিবর্তন, কলাম যোগ করা, টেবিল রিনেম করা ইত্যাদি।
লেখকের কথা: ইনডেক্স ডাটাবেসের পারফরম্যান্স টিউনিংয়ের অন্যতম চাবিকাঠি। সঠিক জায়গায় সঠিক ইনডেক্স আপনার অ্যাপ্লিকেশনকে গতিময় করে তুলবে। বাংলায় প্রযুক্তি শেখার এই সিরিজ চলমান রাখতে আপনার শেয়ার ও কমেন্ট আমাদের অনুপ্রাণিত করে। পোস্টটি ভালো লাগলে বন্ধুদের জানাতে ভুলবেন না! সম্পূর্ণ সিরিজের আপডেট পেতে ToLearnTeam.com সাবস্ক্রাইব করুন। কোনো জিজ্ঞাসা থাকলে কমেন্টে জানান – আমরা উত্তর দিতে প্রস্তুত!
SQLite Full Course
- SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
- SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
- SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
- SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
- SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
- SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
- SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
- SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
- SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
- SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
- SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
- SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
- SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
- SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
- SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
- SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
- SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
- SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
- SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
- SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
- SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
- SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
- SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
- SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
- SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
- SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
- SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
- SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
- SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
- SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
- SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
- SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
- SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
- SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
- SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
- SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
- SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
- SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
- SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
- SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
- SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
- SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
- SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
- SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
- SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
- SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
- SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
- SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
- SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
- SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)
