एक निश्चित तालिका को गति देने का एक निश्चित तरीका अनावश्यक अनुक्रमित को दूर करना है
यहां तालिका के नए संस्करण को लोड करने के लिए प्रारंभिक चरण दिए गए हैं
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
;
कृपया निम्नलिखित ध्यान दें:
मैंने source_persona_index को गिरा दिया क्योंकि यह 4 अन्य अनुक्रमितों में पहला स्तंभ है
- unique_target_persona
- unique_target_object
- source_and_target_object_index
- source_target_persona_index
मैंने target_persona_index को गिरा दिया क्योंकि यह 2 अन्य अनुक्रमितों में पहला स्तंभ है
- target_persona_relation_type_index
- target_persona_relation_type_message_id_index
मैंने target_persona_relation_type_index गिरा दिया क्योंकि पहले 2 कॉलम target_persona_relation_type_message_id_index में भी हैं
ठीक है कि अनावश्यक सूचकांक का ख्याल रखता है। क्या ऐसे कोई सूचकांक हैं जिनमें कम हृदयता है? यहाँ यह निर्धारित करने का तरीका है कि:
निम्न क्वेरी चलाएँ:
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 पंक्तियाँ हैं। अंगूठे के एक नियम के रूप में, MySQL क्वेरी ऑप्टिमाइज़र एक सूचकांक का उपयोग नहीं करेगा यदि चयनित स्तंभों की कार्डिनैलिटी तालिका पंक्ति गणना का 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;
यह सही है? NOPE !!!
यदि आपकी वेबसाइट इस पूरे समय तक रही है, तो s_relations_new के लोडिंग के दौरान s_relations के विरुद्ध INSERT चल सकते हैं। आप उन लापता पंक्तियों को कैसे पुनः प्राप्त कर सकते हैं?
S_relations_new में अधिकतम आईडी ढूंढें और s_relations से उस आईडी के बाद सब कुछ संलग्न करें। यह सुनिश्चित करने के लिए कि तालिका केवल जमी हुई है और इस अद्यतन के लिए उपयोग की जाती है, आपके पास उन अंतिम पंक्तियों को प्राप्त करने के लिए थोड़ा डाउनटाइम होना चाहिए जिन्हें s_relation_new में डाला गया था। आप को क्या करना है यहां बताया गया है:
ओएस में, mysql को पुनरारंभ करें ताकि कोई और लॉग इन न कर सके लेकिन रूट @ localhost (टीसीपी / आईपी अक्षम करता है):
$ 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
अब, यदि आप mysql को नीचे नहीं ले जा सकते हैं, तो आपको s_relations पर एक चारा-और-स्विच करना होगा। बस mysql में लॉगिन करें और निम्न कार्य करें:
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
, वह कॉलम दिखाएं जिसे बदलने की आवश्यकता है, कॉलम का डेटाटाइप और कॉलम का नया नाम।