क्या Drupal डेटाबेस में अनुक्रमणिका जोड़ना सुरक्षित है?


12

मैं इस बारे में खोज और पढ़ रहा हूं, लेकिन मैंने ड्रुपल तालिकाओं (कोर और कंट्रीब दोनों) में अनुक्रमित जोड़ने के विषय के बारे में कुछ भी निश्चित नहीं देखा है।

मेरी मुख्य चिंता यह है कि किसी भी कस्टम इंडेक्स के साथ क्या होता है जब आप कोर या कंट्रीब कोड को अपडेट करते हैं और स्कीमा परिवर्तन होते हैं। इस मामले में क्या होता है?

संपादित करें:

मुझे लगता है कि कुछ संदर्भ से मदद मिल सकती है। मैं मुख्य रूप से साइट प्रदर्शन को ट्यून करने के लिए अनुक्रमणिका को जोड़ने से संबंधित हूं (धीमी क्वेरी लॉग में दिखाई देने वाले प्रश्न, धीमे विचारों वाले पृष्ठ, आदि)। इसमें किसी अन्य मॉड्यूल में तालिका में अनुक्रमणिका जोड़ना शामिल हो सकता है। उदाहरण के लिए

  1. मैं मॉड्यूल स्थापित करता हूं foo
  2. मॉड्यूल फू तालिका बनाता है foo
  3. मैं तालिका में एक सूचकांक जोड़ता हूं foo
  4. मॉड्यूल fooमें एक अपडेट है जो स्कीमा को बदलता है

क्या होता है?

जवाबों:


7

हाँ, यह समस्याओं में परिणाम सकता है।

यदि कोई मॉड्यूल उस कॉलम के साथ कुछ करना चाहता है, जिस पर आपने एक इंडेक्स जोड़ा है, तो यह स्वयं के इंडेक्स को हटा देगा और फिर जो भी ऑपरेशन करना है, उसे करने का इरादा रखता है।

वास्तव में क्या होगा यह आपके डेटाबेस प्रकार और वास्तव में निष्पादित ऑपरेशन पर निर्भर करेगा। उदाहरण के लिए, कॉलम का एक नाम MySQL के साथ ठीक काम करेगा, लेकिन PostgreSQL पर विफल रहेगा। लेकिन अगर यह उस कॉलम को हटाने की कोशिश करता है (हो सकता है कि डेटा को किसी अलग टेबल / कॉलुन में माइग्रेट करने के बाद), यह विफल हो जाएगा।

यह होने वाली संभावनाएं अपेक्षाकृत कम हैं, कम से कम मामूली अपडेट के लिए (हालांकि यह वास्तविक मॉड्यूल पर निर्भर करता है। मैं आमतौर पर कोई भी बदलाव नहीं करता हूं जो मामूली रिलीज के लिए कुछ तोड़ सकता है), लेकिन यह संभव है।

मेरा सुझाव यह होगा कि आप मॉड्यूल अनुरक्षकों के साथ मिलकर काम करने की कोशिश करेंगे। यदि समस्याग्रस्त क्वेरी / ies मॉड्यूल से ही हैं, तो अनुचर संभवत: अनुक्रमणिका को खुशी से जोड़ देंगे, यदि आप एक पैच प्रदान करते हैं। सूचकांक जोड़ने से पहले और बाद में समस्याग्रस्त क्वेरी / ies का DESCRIBE आउटपुट प्रदान करें। एक पैच भी प्रदान करें जो स्कीमा को अपडेट करता है (इसमें मौजूदा प्रतिष्ठानों के लिए इसे सेट करने के लिए एक अपडेट फ़ंक्शन शामिल है)।

कोई है जो सक्रिय रूप से प्रदर्शन से संबंधित चीजों पर काम कर रहा है और ऊपर वाला वास्तव में अच्छी तरह से पकड़ता है, यहाँ एक उदाहरण है: http://drupal.org/node/983950


2

जैसा कि DatabaseSchema_pgsql :: changeField में और db_change_field () में बताया गया है :

महत्वपूर्ण नोट: डेटाबेस पोर्टेबिलिटी बनाए रखने के लिए, आपको स्पष्ट रूप से सभी सूचकांकों और प्राथमिक कुंजियों को फिर से बनाना होगा जो परिवर्तित फ़ील्ड का उपयोग कर रहे हैं।

इसका मतलब यह है कि आपको db_drop_ {Primary_key, unique_key, index} () से db_change_field () कॉल करने से पहले सभी प्रभावित कुंजी और इंडेक्स को छोड़ना होगा। कुंजियों और सूचकांकों को फिर से बनाने के लिए, कुंजी परिभाषाओं को वैकल्पिक $ new_keys तर्क के रूप में सीधे db_change_field () में पास करें।

उदाहरण के लिए, मान लीजिए कि आपके पास:

$schema['foo'] = array(
  'fields' => array(
    'bar' => array('type' => 'int', 'not null' => TRUE)
  ),
  'primary key' => array('bar')
);

और आप foo.bar को सीरियल की तरह बदलना चाहते हैं, इसे प्राथमिक कुंजी के रूप में छोड़ दें। सही क्रम है:

db_drop_primary_key($ret, 'foo');
db_change_field($ret, 'foo', 'bar', 'bar',
  array('type' => 'serial', 'not null' => TRUE),
  array('primary key' => array('bar'))
);

इसी तरह का कोड Drupal 7 के लिए बताया गया है।

ध्यान रखें कि, मेरे अनुभव के लिए, आप एक प्राथमिक कुंजी नहीं निकाल सकते हैं जो एक सीरियल फ़ील्ड का उपयोग करती है। Drupal 6 पर, मुझे हर बार एक त्रुटि मिली जो मैंने करने की कोशिश की; मैंने ड्रुपल 7 पर कोशिश नहीं की।

इसके अलावा, मुझे कोई अन्य समस्या नहीं है जो आप डेटाबेस अनुक्रमित के साथ कर सकते हैं।

एक डेटाबेस टेबल में एक इंडेक्स जोड़ने के बारे में जो दूसरे मॉड्यूल से बनाया गया है, मैं ऐसा करने का सुझाव नहीं दूंगा, क्योंकि:

  • एक मॉड्यूल उस फ़ील्ड के लिए एक इंडेक्स को नहीं गिराता है जिसे बदला जा रहा है, यदि मॉड्यूल खुद उस इंडेक्स को नहीं बनाता है। मॉड्यूल के लिए ऐसा करना संभव नहीं होगा क्योंकि यह सूचकांक का नाम नहीं जानता है।
  • किसी अन्य मॉड्यूल द्वारा बनाई गई डेटाबेस तालिका को संशोधित करना एक अच्छा विचार नहीं है, यहां तक ​​कि मामले में मॉड्यूल एक कोर मॉड्यूल है। यदि एक और मॉड्यूल है जो एक ही टेबल को बदलता है, तो मॉड्यूल एक दूसरे के साथ होने वाले किसी भी संघर्ष को कैसे संभाल सकते हैं, या उन परिवर्तनों के साथ जो कोर मॉड्यूल अपने डेटाबेस पर लागू होगा?

यदि डेटाबेस तालिका किसी अन्य मॉड्यूल (एक कोर मॉड्यूल या एक तृतीय-पक्ष मॉड्यूल) से बनाई जा रही है, तो मैं नए सूचकांक का उपयोग करने के लिए उपयोग के मामले प्रदान करते हुए, मॉड्यूल के लिए एक सुविधा अनुरोध खोलने का सुझाव दूंगा; यदि कोई प्रदर्शन समस्या है, तो एक इंडेक्स जोड़ना वांछित कार्य हो सकता है।

यदि आप किसी अन्य मॉड्यूल से अपनी खुद की साइट पर बनाए गए टेबल में एक इंडेक्स जोड़ने जा रहे हैं, तो किसी भी बदलाव के लिए तैयार रहें जिसे आपको मॉड्यूल के अपडेट होने पर और अपने साइट में स्थापित करने से पहले हर बार करना होगा। ।
यह वह है जो यह तय कर सकता है कि अतिरिक्त काम आपके द्वारा प्राप्त किए जाने वाले प्रदर्शन के लायक है या नहीं। व्यक्तिगत रूप से, मुझे नहीं लगता कि यह मूल्य है, हालांकि।


धन्यवाद। यह कैसे काम करेगा अगर मैं एक धीमी गति से क्वेरी का मुकाबला करने के लिए एक तालिका में एक सूचकांक जोड़ता हूं, न कि केवल अपने स्वयं के मॉड्यूल में बदलाव? जब मुझे मौका मिलेगा मैं अपने प्रश्न को थोड़ा और स्पष्ट करने की कोशिश करूंगा।
mpdonadio

3
इसके अलावा आप डीबी ट्यूनर का उपयोग करने पर विचार कर सकते हैं जो यह जानना आसान है कि किस इंडेक्स को बनाना है।
tostinni

@tostinni हाँ, यह सवाल डीबी ट्यूनर की सिफारिशों को लागू करने से संबंधित था।
mpdonadio
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.