আমরা গত পর্বে জেনেছি যে ইনডেক্স ডেটা খোঁজার গতি বাড়ায়, এবং SQLite স্বয়ংক্রিয়ভাবে উপযুক্ত ইনডেক্স নির্বাচন করে। কিন্তু কখনো কখনো আমরা নিজেরা নির্দিষ্ট করে দিতে চাই যে কোনো কোয়েরিতে কোন ইনডেক্স ব্যবহার করা হবে, নাকি কোনো ইনডেক্সই ব্যবহার করা হবে না। SQLite-তে এটি করার জন্য INDEXED BY ও NOT INDEXED ক্লজ দুটি ব্যবহৃত হয়। আজ আমরা এই ক্লজ দুটির ব্যবহারিক প্রয়োগ, সুবিধা ও সীমাবদ্ধতা উদাহরণসহ শিখব।
পূর্বপ্রস্তুতি
- SQLite ইন্সটল থাকতে হবে।
COMPANYটেবিল সম্বলিতindexedby_demo.dbডাটাবেস তৈরি করি। সাথে একটি ইনডেক্সও তৈরি করব।
টার্মিনাল:
bash
sqlite3 indexedby_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); -- SALARY-র উপর একটি ইনডেক্স তৈরি করি CREATE INDEX salary_index ON COMPANY (SALARY);
- আউটপুট ফরম্যাট:
.header on,.mode column।
১. INDEXED BY ক্লজ
INDEXED BY ক্লজ ব্যবহার করে আপনি নির্দিষ্ট একটি ইনডেক্সের মাধ্যমে টেবিল অ্যাক্সেস করতে বাধ্য করতে পারেন। যদি উল্লেখিত ইনডেক্স না থাকে বা সেই কোয়েরির জন্য ব্যবহার করা সম্ভব না হয়, তাহলে SQLite এরর তৈরি করবে এবং স্টেটমেন্টটি ব্যর্থ হবে।
সিনট্যাক্স (SELECT-এর জন্য):
sql
SELECT column_list FROM table_name INDEXED BY index_name WHERE condition;
একইভাবে DELETE ও UPDATE-তেও INDEXED BY ব্যবহার করা যায়, যেখানে WHERE ক্লজের ভিত্তিতে সারি খোঁজা হয়।
২. INDEXED BY-এর উদাহরণ
আমরা salary_index ইনডেক্সটি ব্যবহার করে তাদের বের করি যাদের বেতন ৫০০০-এর বেশি।
sql
SELECT * FROM COMPANY INDEXED BY salary_index WHERE SALARY > 5000;
ফলাফল:
text
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 7 James 24 Houston 10000.0 2 Allen 25 Texas 15000.0 1 Paul 32 California 20000.0 3 Teddy 23 Norway 20000.0 6 Kim 22 South-Hall 45000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0
এখন যদি ভুল ইনডেক্স নাম দিই:
sql
SELECT * FROM COMPANY INDEXED BY wrong_index WHERE SALARY > 5000;
এরর: no such index: wrong_index
কিংবা এমন ইনডেক্স দিই যা WHERE-এর কলামে ব্যবহার করা যায় না (যেমন NAME-এর উপর ইনডেক্স নেই, অথচ AGE-তে চালাচ্ছি):
sql
CREATE INDEX age_idx ON COMPANY (AGE); SELECT * FROM COMPANY INDEXED BY age_idx WHERE SALARY > 5000; -- সম্ভবত কাজ করবে না বা ভুল রেজাল্ট দেবে; বাস্তবে এটি ইনডেক্স ব্যবহার করতে বাধ্য করবে, কিন্তু পারফরম্যান্স কমতে পারে, যদিও SQLite সাধারণত মান্য করে। তবে যদি ইনডেক্সের সাথে WHERE-এর কলামের সম্পর্ক না থাকে, তবুও এটি ইনডেক্স স্ক্যান করতে পারে। এরর তখনই হবে যখন ইনডেক্স একেবারেই ব্যবহার অনুপযোগী (যেমন WHERE ছাড়া)।
তবে মূল বিষয়: INDEXED BY দিয়ে আপনি একটি নির্দিষ্ট ইনডেক্সের ব্যবহার জোর করতে পারেন, এবং যদি সেটি সম্ভব না হয়, তাহলে স্টেটমেন্ট প্রস্তুতিতেই ব্যর্থ হবে।
৩. NOT INDEXED ক্লজ
NOT INDEXED ক্লজ দিয়ে আপনি নির্দেশ দেন যে এই টেবিলের জন্য কোনো ইনডেক্স ব্যবহার করা হবে না, এমনকি প্রাইমারি কি বা ইউনিক কনস্ট্রেইন্টের কারণে তৈরি ইমপ্লিসিট ইনডেক্সও না। তবে ব্যতিক্রম: INTEGER PRIMARY KEY সবসময় ব্যবহার করা যেতে পারে সারি খুঁজতে, NOT INDEXED থাকলেও।
সিনট্যাক্স:
sql
SELECT column_list FROM table_name NOT INDEXED WHERE condition;
উদাহরণ:
sql
SELECT * FROM COMPANY NOT INDEXED WHERE SALARY > 5000;
এটি ইনডেক্স ব্যবহার না করে সম্পূর্ণ টেবিল স্ক্যান করবে। ছোট টেবিলে পার্থক্য বোঝা না গেলেও বড় টেবিলে এটি ধীরগতির হতে পারে।
NOT INDEXED সাধারণত তখন ব্যবহার করা হয় যখন আপনি জানেন যে ইনডেক্স ব্যবহার না করাই ভালো (যেমন খুব ছোট টেবিল, অথবা ইনডেক্স দুষ্প্রাপ্য), অথবা ডিবাগিংয়ের উদ্দেশ্যে।
৪. INDEXED BY এবং NOT INDEXED-এর ব্যবহারিক গুরুত্ব
- ডিবাগিং ও পারফরম্যান্স টিউনিং: আপনি পরীক্ষা করতে পারেন কোনো নির্দিষ্ট ইনডেক্স কোনো কোয়েরির গতি বাড়াচ্ছে কিনা, বা ইনডেক্স ছাড়া কেমন গতি হয়।
- কোয়েরি প্ল্যান নিয়ন্ত্রণ: অনেক সময় SQLite-র অটোমেটিক ইনডেক্স সিলেকশন আপনার পছন্দ মতো নাও হতে পারে; তখন
INDEXED BYদিয়ে সঠিক ইনডেক্সে বাধ্য করা যায়। - সতর্কতা: ভুল ইনডেক্স জোর করলে কোয়েরি ব্যর্থ হবে। তাই শুধুমাত্র তখনই ব্যবহার করবেন যখন আপনি নিশ্চিত যে ওই ইনডেক্সটি কোয়েরির জন্য কার্যকর।
৫. ডিরেক্টরি স্ট্রাকচার ও প্যাকেজ
শুধুমাত্র indexedby_demo.db ফাইলটি ব্যবহৃত হচ্ছে। কোনো অতিরিক্ত প্যাকেজ ইন্সটল করতে হবে না।
text
project-folder/ └── indexedby_demo.db
৬. গুরুত্বপূর্ণ টিপস
INDEXED BYব্যবহার করার আগেEXPLAIN QUERY PLANদিয়ে দেখুন SQLite আসলে কী করছে। তারপর ইচ্ছাকৃতভাবে ইনডেক্স পরিবর্তন করে তুলনা করুন।NOT INDEXEDদিলেওINTEGER PRIMARY KEYকলামে সরাসরিWHERE id = ?দ্রুত কাজ করবে, কারণ এটিrowid-এর অ্যালিয়াস।- যেসব ক্ষেত্রে টেবিল খুব ছোট, সেখানে
NOT INDEXEDব্যবহার করলে ইনডেক্স লুকআপের ওভারহেড বাঁচে, ফলে গতি বাড়তে পারে। - একই কোয়েরিতে একাধিক টেবিল থাকলে প্রতিটি টেবিলের জন্য আলাদাভাবে
INDEXED BYবাNOT INDEXEDউল্লেখ করা যায়।
৭. সম্পূর্ণ অনুশীলন সেশন
sql
.headers on .mode column -- ইনডেক্স তৈরি (আগেই করা আছে) CREATE INDEX IF NOT EXISTS salary_index ON COMPANY (SALARY); -- INDEXED BY দিয়ে SELECT SELECT * FROM COMPANY INDEXED BY salary_index WHERE SALARY BETWEEN 10000 AND 50000; -- NOT INDEXED দিয়ে SELECT (কোনো ইনডেক্স নয়) SELECT * FROM COMPANY NOT INDEXED WHERE AGE = 25; -- UPDATE-তে INDEXED BY UPDATE COMPANY INDEXED BY salary_index SET ADDRESS = 'Dallas' WHERE SALARY = 20000; SELECT * FROM COMPANY; -- DELETE-তে INDEXED BY DELETE FROM COMPANY INDEXED BY salary_index WHERE SALARY < 15000; -- ভুল ইনডেক্স নাম দিয়ে পরীক্ষা (এরর আসবে) -- SELECT * FROM COMPANY INDEXED BY wrong_index WHERE SALARY > 1000;
পরবর্তী পর্বে
আমরা শিখব SQLite ALTER TABLE – টেবিলের কাঠামো পরিবর্তনের সীমিত কিন্তু গুরুত্বপূর্ণ কমান্ডগুলো।
লেখকের কথা: INDEXED BY দিয়ে আপনি নিজের ইচ্ছেমতো ইনডেক্স নিয়ন্ত্রণ করতে পারেন, যা বিশেষ করে বড় ও জটিল ডাটাবেসে কাজে আসে। বাংলায় SQLite শেখার এই সিরিজ চলমান রাখতে আপনার উৎসাহ একান্ত প্রয়োজন। পোস্টটি ভালো লাগলে শেয়ার করুন, এবং সিরিজের সব আপডেট পেতে 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 – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)
