SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)

Blog / SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)

SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা) Detail Page

SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)

SQLite INDEXED BY এবং NOT INDEXED ক্লজের বাংলা টিউটোরিয়াল

আমরা গত পর্বে জেনেছি যে ইনডেক্স ডেটা খোঁজার গতি বাড়ায়, এবং 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

  1. SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
  2. SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
  3. SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
  4. SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
  5. SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
  6. SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
  7. SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
  8. SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
  9. SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
  10. SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
  11. SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
  12. SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
  13. SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
  14. SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
  15. SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
  16. SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  17. SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
  18. SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
  19. SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
  20. SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
  21. SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
  22. SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
  23. SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
  24. SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  25. SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
  26. SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
  27. SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
  28. SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
  29. SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
  30. SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
  31. SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
  32. SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
  33. SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
  34. SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
  35. SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
  36. SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
  37. SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
  38. SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
  39. SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
  40. SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
  41. SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
  42. SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
  43. SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
  44. SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
  45. SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
  46. SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
  47. SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
  48. SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
  49. SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
  50. SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)

Leave a Reply

Welcome to To Learn Team, a dynamic educational platform where knowledge meets collaboration. Designed for students, educators, and lifelong learners, we provide a curated hub of interactive study groups, expert tutorials, and comprehensive resources across diverse subjects. We believe that learning is most powerful when done together. By uniting a global community, we transform curiosity into confidence and individual aspirations into shared achievements. Join the To Learn Team today—elevate your intellect and grow with us!

Get In Touch

Address

Dhaka, Bangladesh

Email

abir43tee@gmail.com

Phone

+880 1711427737

Quick Search