অলটার টেবিলে গতি বাড়ানোর একটি নিশ্চিত উপায় হ'ল অপ্রয়োজনীয় সূচকগুলি সরিয়ে ফেলা
টেবিলের একটি নতুন সংস্করণ লোড করার প্রাথমিক পদক্ষেপ এখানে
CREATE TABLE s_relations_new LIKE s_relations;
#
# Drop Duplicate Indexes
#
ALTER TABLE s_relations_new
DROP INDEX source_persona_index,
DROP INDEX target_persona_index,
DROP INDEX target_persona_relation_type_index
;
নিম্নলিখিত নোট করুন:
আমি উত্স_পারসোনা_আইডেক্সকে বাদ দিয়েছি কারণ এটি অন্যান্য 4 সূচকের প্রথম কলাম
- unique_target_persona
- unique_target_object
- source_and_target_object_index
- source_target_persona_index
আমি টার্গেট_পারসোনা_আইডেক্সকে বাদ দিয়েছি কারণ এটি অন্যান্য 2 সূচকের প্রথম কলাম
- target_persona_relation_type_index
- target_persona_relation_type_message_id_index
আমি টার্গেট_পারসোনা_ রিলেশন_ টাইপ_আইডেক্সকে বাদ দিয়েছি কারণ প্রথম 2 টি কলামগুলিও টার্গেট_পারসোনা_ রিলেশন_ টাইপ_মেসেজ_আইডি_আইডেক্সে রয়েছে
ঠিক আছে এটি অপ্রয়োজনীয় সূচকের যত্ন নেয়। এমন কোনও সূচক রয়েছে যার কার্ডিনালিটি কম? এটি নির্ধারণের জন্য এখানে উপায়:
নিম্নলিখিত প্রশ্নগুলি চালান:
SELECT COUNT(DISTINCT sent_at) FROM s_relations;
SELECT COUNT(DISTINCT message_id) FROM s_relations;
SELECT COUNT(DISTINCT target_object_id) FROM s_relations;
আপনার প্রশ্ন অনুসারে প্রায় 80,000,000 সারি রয়েছে। থাম্বের নিয়ম হিসাবে, নির্বাচিত কলামগুলির কার্ডিনালিটি টেবিলের সারি গণনার 5% এর চেয়ে বেশি হলে মাইএসকিউএল কোয়েরি অপ্টিমাইজার কোনও সূচক ব্যবহার করবে না। এই ক্ষেত্রে, এটি 4,000,000 হবে।
- যদি
COUNT(DISTINCT sent_at)
> 4,000,000
- তারপর
ALTER TABLE s_relations_new
DROP INDEX sent_at_index;
- যদি
COUNT(DISTINCT message_id)
> 4,000,000
- তারপর
ALTER TABLE s_relations_new
DROP INDEX message_id_index;
- যদি
COUNT(DISTINCT target_object_id)
> 4,000,000
- তারপর
ALTER TABLE s_relations_new
DROP INDEX target_object_index;
একবারে সেই সূচকগুলির কার্যকারিতা বা অকেজোতা নির্ধারণ করা হলে আপনি ডেটা পুনরায় লোড করতে পারেন
#
# Change the Column Name
# Load the Table
#
ALTER TABLE s_relations_new CHANGE sent_at sent_at_new int(11) DEFAULT NULL;
INSERT INTO s_relations_new SELECT * FROM s_relations;
ঠিক তাই না? না !!!
যদি আপনার ওয়েবসাইটটি এই পুরো সময়টি অবধি থাকে তবে s_references_ নতুন লোড করার সময় s_re ਸੰਬੰਧগুলির বিরুদ্ধে INSERTs চলতে পারে। আপনি কীভাবে এই নিখোঁজ সারিগুলি পুনরুদ্ধার করতে পারেন?
S_references_ নতুন মধ্যে সর্বাধিক আইডি সন্ধান করুন এবং s_references থেকে সেই আইডির পরে সমস্ত কিছু যুক্ত করুন। টেবিলটি হিমশীতল এবং কেবলমাত্র এই আপডেটের জন্য ব্যবহৃত হয়েছে তা নিশ্চিত করার জন্য, আপনাকে s_relation_new thoseোকানো হয়েছে এমন শেষ সারিগুলি পাওয়ার জন্য আপনার অবশ্যই কিছুটা ডাউনটাইম করতে হবে। এখানে কি কি:
ওএসে, মাইএসকিএল পুনরায় চালু করুন যাতে অন্য কেউ লগইন করতে না পারে তবে রুট @ লোকালহোস্ট (টিসিপি / আইপি অক্ষম করে):
$ service mysql restart --skip-networking
এরপরে, mysql এ লগইন করুন এবং সেই শেষ সারিগুলি লোড করুন:
mysql> SELECT MAX(id) INTO @maxidnew FROM s_relations_new;
mysql> INSERT INTO s_relations_new SELECT * FROM s_relations WHERE id > @maxidnew;
mysql> ALTER TABLE s_relations RENAME s_relations_old;
mysql> ALTER TABLE s_relations_new RENAME s_relations;
তারপরে, সাধারণত mysql পুনরায় আরম্ভ করুন
$ service mysql restart
এখন, আপনি যদি মাইএসকিএল নামাতে না পারেন, আপনাকে s_references উপর একটি টোপ এবং স্যুইচ করতে হবে। কেবল মাইএসকিএল-এ লগইন করুন এবং নিম্নলিখিতগুলি করুন:
mysql> ALTER TABLE s_relations RENAME s_relations_old;
mysql> SELECT MAX(id) INTO @maxidnew FROM s_relations_new;
mysql> INSERT INTO s_relations_new SELECT * FROM s_relations_old WHERE id > @maxidnew;
mysql> ALTER TABLE s_relations_new RENAME s_relations;
একবার চেষ্টা করে দেখো !!!
কভ্যাট: একবার আপনি এই ক্রিয়াকলাপে সন্তুষ্ট হয়ে গেলে, আপনি আপনার প্রাথমিক সুবিধায় পুরানো টেবিলটি ফেলে দিতে পারেন:
mysql> DROP TABLE s_relations_old;
SHOW CREATE TABLE tblname\G
করে কলামটি পরিবর্তন করা দরকার, কলামের ডেটাটাইপ এবং কলামটির নতুন নামটি দেখান।