MySQL-এ বড় টেবিলে ইনডেক্স যোগ বা রিপেয়ার করার সময় "repair with keycache" মেসেজ আসলে পারফরম্যান্স খুব ধীর হয়। এটি এড়াতে টেবিল রিক্রিয়েট করে ইনডেক্স যোগ করার পদ্ধতি ব্যবহার করা হয়।
সমস্যা
ALTER TABLE ... ADD INDEX বড় টেবিলে "repair with keycache" ট্রিগার করতে পারে, যা ডিস্ক-ভিত্তিক সর্ট ব্যবহার করে এবং খুব ধীর।
সমাধান: টেবিল রিক্রিয়েট করুন
স্টেপ ১: নতুন টেবিল তৈরি করুন পুরোনো ডেটা দিয়ে
CREATE TABLE yourNewTableName AS (SELECT * FROM yourOldTableName);
স্টেপ ২: নতুন টেবিলে ইনডেক্স যোগ করুন
ALTER TABLE yourNewTableName ADD INDEX(yourColumnName);
স্টেপ ৩: পুরোনো টেবিল রিপ্লেস করুন (অপশনাল)
RENAME TABLE yourOldTableName TO yourOldTableName_backup,
yourNewTableName TO yourOldTableName;
উদাহরণ
প্রাথমিক টেবিল
mysql> CREATE TABLE DemoTable (
-> StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentFirstName VARCHAR(20),
-> StudentLastName VARCHAR(20)
-> );
mysql> INSERT INTO DemoTable(StudentFirstName, StudentLastName) VALUES('John', 'Doe');
mysql> INSERT INTO DemoTable(StudentFirstName, StudentLastName) VALUES('David', 'Miller');
স্টেপ ১: টেবিল রিক্রিয়েট
mysql> CREATE TABLE DemoTable AS (SELECT * FROM DemoTable);
Query OK, 2 rows affected (0.34 sec)
স্টেপ ২: ইনডেক্স যোগ (বिना "repair with keycache")
mysql> ALTER TABLE DemoTable ADD INDEX(StudentFirstName);
Query OK, 2 rows affected (0.57 sec)
কেন কাজ করে? নতুন টেবিলে ডেটা ইনসার্ট হওয়ার সময়ই ইনডেক্স বিল্ড হয় (bulk load), যা keycache ব্যবহার না করে সর্ট বাফার ব্যবহার করে - দ্রুত হয়।
অন্য বিকল্প: MySQL 8.0+ ইনস্ট্যান্ট ADD COLUMN/INDEX
MySQL 8.0+ এ ALGORITHM=INSTANT বা ALGORITHM=INPLACE ব্যবহার করে কিছু অপারেশন লক-ফ্রি এবং দ্রুত হয়:
ALTER TABLE DemoTable ADD INDEX(StudentFirstName), ALGORITHM=INPLACE;
সারসংক্ষেপ: বড় টেবিলে ইনডেক্স যোগ করার আগে টেবিল রিক্রিয়েট করুন "repair with keycache" এড়াতে।