मेरे पास MySQL में 50k पंक्तियों वाली एक तालिका है और हाल ही में एक नई अनुक्रमणिका जोड़ी गई है। जब मैं दौड़ता हूं (जो मेरी तालिका में प्रत्येक अनुक्रमणिका का आकार दिखाता है):

SELECT database_name, table_name, index_name,
ROUND(stat_value * @@innodb_page_size / 1024 / 1024, 2) size_in_mb
FROM mysql.innodb_index_stats
WHERE table_name = 'table_name' and stat_name = 'size' 
ORDER BY size_in_mb DESC;

यह मेरी नव निर्मित अनुक्रमणिका के लिए 1.5 mb दिखाता है। क्या इसका मतलब यह है कि जब मैं एक नई अनुक्रमणिका बनाता हूं तो MySQL स्वचालित रूप से मौजूदा तालिका को अनुक्रमित करता है या क्या मुझे इसे OPTIMIZE TABLE या इसी तरह के आदेशों के साथ मैन्युअल रूप से पुन: अनुक्रमित करना होगा? मैं InnoDB (संस्करण 5.7.26) का उपयोग कर रहा हूं।

गति के अनुसार, यह मेरे प्रश्नों के प्रदर्शन में बिल्कुल भी सुधार नहीं करता है, इसलिए मैं सोच रहा था कि रीइंडेक्सिंग आवश्यक है।

1
Nfff3 17 अक्टूबर 2020, 15:59

2 जवाब

सबसे बढ़िया उत्तर

क्या इसका मतलब यह है कि जब मैं एक नई अनुक्रमणिका बनाता हूं तो MySQL स्वचालित रूप से मौजूदा तालिका को अनुक्रमित करता है?

हाँ ऐसा होता है। यह तालिका में मौजूदा डेटा को स्कैन करता है और उसके अनुसार इंडेक्स बनाता है। यदि आप एक unique अनुक्रमणिका बना रहे हैं, तो यह यह भी सुनिश्चित करता है कि डेटा एकता की कमी को पूरा करता है, और यदि ऐसा नहीं होता है तो यह विफल हो जाता है।

क्या मुझे इसे OPTIMIZE TABLE के साथ मैन्युअल रूप से फिर से अनुक्रमित करना होगा?

नव निर्मित अनुक्रमणिका संभवतः तत्काल optimize table को लाभ नहीं पहुंचाएगी। ऐसा करना अभी भी एक अच्छा विचार हो सकता है, क्योंकि आदेश तालिका के भंडारण को पुनर्गठित करता है, और अन्य अनुक्रमणिका यदि कोई हो।

1
GMB 17 अक्टूबर 2020, 16:14

इंडेक्स बनाने से इंडेक्स भी बनता है। अनुक्रमणिका निर्माण डेटा परिभाषा भाषा को ऑनलाइन DDL माना जाता है।

1
O. Jones 17 अक्टूबर 2020, 16:15