การเพิ่มดัชนีในฐานข้อมูล Drupal ปลอดภัยหรือไม่?


12

ฉันค้นหาและอ่านเกี่ยวกับเรื่องนี้ แต่ฉันไม่เห็นอะไรชัดเจนเกี่ยวกับหัวข้อของการเพิ่มดัชนีในตาราง Drupal (ทั้งแกนและ contrib)

ข้อกังวลหลักของฉันคือสิ่งที่เกิดขึ้นกับดัชนีที่กำหนดเองเมื่อคุณอัปเดตคอร์หรือรหัส contrib และมีการเปลี่ยนแปลงสคีมา เกิดอะไรขึ้นในกรณีนี้

แก้ไข:

ฉันคิดว่าบริบทบางอย่างอาจช่วยได้ ฉันเกี่ยวข้องกับการเพิ่มดัชนีลงในตารางเพื่อปรับแต่งประสิทธิภาพของไซต์เป็นหลัก (แบบสอบถามแสดงในบันทึกการสืบค้นช้าหน้าเว็บที่มีมุมมองช้า ฯลฯ ) สิ่งนี้อาจเกี่ยวข้องกับการเพิ่มดัชนีในตารางในโมดูลของบุคคลอื่น ตัวอย่างเช่น

  1. ฉันติดตั้งโมดูล foo
  2. โมดูล foo สร้างตาราง foo
  3. ฉันเพิ่มดัชนีลงในตาราง foo
  4. โมดูลfooมีการปรับปรุงที่เปลี่ยนสคีมา

เกิดอะไรขึ้น?

คำตอบ:


7

ใช่มันอาจส่งผลให้เกิดปัญหา

หากโมดูลต้องการทำบางสิ่งบางอย่างกับคอลัมน์ที่คุณเพิ่มดัชนีมันจะลบดัชนีของตัวเองออกจากนั้นทำสิ่งใดก็ตามที่มันตั้งใจจะทำ

สิ่งที่จะเกิดขึ้นจะขึ้นอยู่กับประเภทฐานข้อมูลของคุณและการดำเนินการที่ดำเนินการจริง ตัวอย่างเช่นการเปลี่ยนชื่อคอลัมน์จะทำงานได้ดีกับ MySQL แต่จะล้มเหลวใน PostgreSQL แต่ถ้าพยายามลบคอลัมน์นั้น (อาจหลังจากย้ายข้อมูลไปยังตาราง / colun อื่น) มันจะล้มเหลว

โอกาสที่จะเกิดขึ้นค่อนข้างต่ำอย่างน้อยสำหรับการอัปเดตเล็กน้อย (ขึ้นอยู่กับโมดูลจริงอย่างไรก็ตามฉันมักจะไม่เพิ่มการเปลี่ยนแปลงใด ๆ

คำแนะนำของฉันคือคุณพยายามทำงานร่วมกับผู้ดูแลโมดูล หากแบบสอบถาม / ปัญหาที่มาจากโมดูลนั้นผู้ดูแลอาจจะเพิ่มดัชนีอย่างมีความสุขถ้าคุณให้แพทช์ จัดทำเอาต์พุต DESCRIBE ของเคียวรี / ies ที่มีปัญหาก่อนและหลังการเพิ่มดัชนี นอกจากนี้ยังมีชุดข้อมูลแก้ไขที่ปรับปรุง schema (รวมถึงฟังก์ชั่นอัพเดทเพื่อตั้งค่าสำหรับการติดตั้งที่มีอยู่)

คนที่ทำงานเกี่ยวกับประสิทธิภาพการทำงานและทำสิ่งที่ดีกว่านั้นเป็นเรื่องที่จับได้นี่คือตัวอย่าง: 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 ฉันพบข้อผิดพลาดทุกครั้งที่ฉันลองทำเช่นนั้น ฉันไม่ได้ลองใน Drupal 7

นอกจากนั้นฉันไม่ทราบปัญหาอื่น ๆ ที่คุณอาจมีกับดัชนีฐานข้อมูล

เกี่ยวกับการเพิ่มดัชนีในตารางฐานข้อมูลที่สร้างจากโมดูลอื่นฉันจะไม่แนะนำให้ทำเช่นนั้นเพราะ:

  • โมดูลจะไม่ดร็อปดัชนีสำหรับเขตข้อมูลที่มีการเปลี่ยนแปลงหากโมดูลนั้นไม่ได้สร้างดัชนีนั้น มันเป็นไปไม่ได้ที่โมดูลจะทำเช่นนั้นเพราะไม่ทราบชื่อของดัชนี
  • การปรับเปลี่ยนตารางฐานข้อมูลที่สร้างโดยโมดูลอื่นนั้นไม่ใช่ความคิดที่ดีแม้แต่ในกรณีที่โมดูลนั้นเป็นโมดูลหลัก หากมีโมดูลอื่นที่เปลี่ยนแปลงตารางเดียวกันโมดูลจะจัดการกับความขัดแย้งที่มีกับแต่ละอื่น ๆ ได้อย่างไรหรือด้วยการเปลี่ยนแปลงโมดูลหลักจะนำไปใช้กับฐานข้อมูลของตัวเองได้อย่างไร

หากตารางฐานข้อมูลถูกสร้างขึ้นจากโมดูลอื่น (โมดูลหลักหรือโมดูลบุคคลที่สาม) ฉันขอแนะนำให้เปิดการร้องขอคุณสมบัติสำหรับโมดูลโดยระบุกรณีการใช้สำหรับการใช้ดัชนีใหม่ หากมีปัญหาด้านประสิทธิภาพใด ๆ การเพิ่มดัชนีอาจเป็นสิ่งที่ต้องทำ

หากคุณกำลังจะเพิ่มดัชนีไปยังตารางที่สร้างจากโมดูลอื่นในเว็บไซต์ของคุณเองให้เตรียมพร้อมสำหรับการเปลี่ยนแปลงใด ๆ ที่คุณต้องทำกับโมดูลที่กำหนดเองของคุณทุกครั้งที่มีการอัปเดตโมดูลและก่อนที่คุณจะติดตั้งในเว็บไซต์ของคุณเอง .
คุณคือผู้ที่สามารถตัดสินใจได้ว่าการทำงานพิเศษนั้นคุ้มค่ากับประสิทธิภาพที่คุณได้รับหรือไม่ โดยส่วนตัวแล้วฉันไม่คิดว่ามันจะคุ้มค่า


ขอบคุณ มันจะทำงานอย่างไรถ้าฉันเพิ่มดัชนีไปยังตารางเพื่อต่อต้านการสืบค้นที่ช้าไม่ใช่แค่การเปลี่ยนโมดูลของตัวเอง? ฉันจะพยายามแก้ไขคำถามของฉันให้ชัดเจนขึ้นเมื่อมีโอกาส
mpdonadio

3
นอกจากนี้คุณอาจพิจารณาใช้DB Tunerซึ่งเป็นประโยชน์ที่จะรู้ว่าดัชนีที่จะสร้าง
tostinni

@tostinni ใช่คำถามนี้เกี่ยวข้องโดยตรงกับการใช้คำแนะนำจาก DB Tuner
mpdonadio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.