কম্পিউটার টিউটোরিয়াল

MySQL-এ বড় সিলেক্ট কোয়েরি খণ্ডে খণ্ডে (Chunks) পাওয়া

বড় সিলেক্ট কোয়েরি খণ্ডে খণ্ডে পেতে ORDER BY LIMIT ব্যবহার করতে হয়। সিনট্যাক্স নিচে দেওয়া হলো:

SELECT *FROM yourTableName ORDER BY yourColumnName LIMIT 0,10;

উপরের সিনট্যাক্স থেকে টেবিল থেকে ১০টি সারি পাওয়া যাবে। এখানে 0 মানে রেজাল্ট সেটের প্রথম সারি (জিরো-ইন্ডেক্স বেসড)। LIMIT-এর দ্বিতীয় মান মানে টেবিল থেকে সর্বোচ্চ কতগুলো সারি রিট্রিভ করা যাবে।

যদি ১০ এর পরের সারি ৩০ পর্যন্ত চান, তবে LIMIT এভাবে ব্যবহার করুন। সিনট্যাক্স নিচে দেওয়া হলো:

SELECT *FROM yourTableName ORDER BY yourColumnName LIMIT 10,20; //11 to 30

যদি ৩০ থেকে ৫০ পর্যন্ত আরেক সেট সারি চান, তবে আবার LIMIT ব্যবহার করুন:

SELECT *FROM yourTableName ORDER BY yourColumnName LIMIT 30 ,20; 31 to 50.

এই কাজের জন্য টেম্পোরারি টেবিল ব্যবহার করা ভালো। সিনট্যাক্স নিচে দেওয়া হলো:

DROP TEMPORARY TABLE IF EXISTS yourTemporaryTableName; CREATE TEMPORARY TABLE yourTempTableName AS ( SELECT *FROM yourOriginalTableName ORDER BY LIMIT 0,100 );

যদি সব রেকর্ড টেম্পোরারি টেবিলে থাকে, তবে উপরের মত LIMIT ব্যবহার করে টেম্পোরারি টেবিল থেকে রেকর্ড বের করুন।

SELECT *FROM yourTemporaryTableName LIMIT 0,100; SELECT *FROM yourTemporaryTableName LIMIT 100,1000;

এখন আপনার ইচ্ছা অনুযায়ী লিমিট ভ্যালু সেট করুন। এখন টেম্পোরারি টেবিল ড্রপ করা একটি ভালো অভ্যাস। কোয়েরিটি হলো:

DROP TEMPORARY TABLE yourTemporaryTableName;

উপরের আলোচনার ডেমো নিচে দেওয়া হলো। প্রথমে একটি টেবিল তৈরি করা যাক। টেবিল তৈরির কোয়েরি:

mysql> create table getRecordsDemo 
-> ( 
-> Id int NOT NULL AUTO_INCREMENT, 
-> PRIMARY KEY(Id) 
-> ); Query OK, 0 rows affected (1.68 sec)

ইনসার্ট কমান্ড দিয়ে কিছু রেকর্ড ইনসার্ট করা যাক। কোয়েরিটি হলো:

mysql> insert into getRecordsDemo values(),(),()... (738 rows); Query OK, 738 rows affected (0.34 sec)

উপরের টেবিলের মতো একটি টেম্পোরারি টেবিল তৈরি করা যাক। টেম্পোরারি টেবিল তৈরির কোয়েরি:

mysql> drop temporary table if exists TempRecord; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> create temporary table TempRecord 
-> as 
-> ( 
-> select * from getRecordsDemo order by Id limit 0,738 
-> ); Query OK, 738 rows affected (0.03 sec) Records: 738 Duplicates: 0 Warnings: 0

এখন টেম্পোরারি টেবিল থেকে LIMIT ক্লজ ব্যবহার করে খণ্ডে খণ্ডে রেজাল্ট পাওয়া যাক।

কেস ১: টেম্পোরারি টেবিল TempRecord থেকে কিছু রেকর্ড পাওয়ার কোয়েরি:

mysql> select *from TempRecord limit 0,10;

আউটপুট:

+----+ | Id | +----+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 | +----+ 10 rows in set (0.00 sec)

কেস ২: পরবর্তী সেট রেকর্ড পাওয়ার কোয়েরি:

mysql> select *from TempRecord limit 10,20;

আউটপুট (১১ থেকে ৩০): ২০ সারি।

কেস ৩: আরেক সেট রেকর্ড পাওয়ার কোয়েরি:

mysql> select *from TempRecord limit 30,20;

আউটপুট (৩১ থেকে ৫০): ২০ সারি।

ব্যাখ্যা: বড় ডেটাসেট পেজিনেশন বা ব্যাচ প্রসেসিং-এ LIMIT offset, count ব্যবহার করা стандар্ড পদ্ধতি। টেম্পোরারি টেবিল ব্যবহার করে একবার সর্টেড ডেটা স্টোর করলে বারবার বড় টেবিলে ORDER BY রান করার প্রয়োজন নেই, পারফরম্যান্স বাড়ে। MySQL 8.0+ এ CTE (Common Table Expression) ও ব্যবহার করা যায়।

  1. MySQL-এ INSERT INTO SELECT দিয়ে অন্য টেবিল থেকে ডেটা কপি করা

  2. MySQL টেবিল থেকে শুধু ৩টি অর্ডার করা সারি কীভাবে বের করবেন?

  3. MySQL-এ SHOW TABLES ব্যবহার করে ডাটাবেসের সব টেবিল নাম দেখুন

  4. MySQL-এ মাস অনুযায়ী টোটাল বের করা (GROUP BY MONTH)