Apakah menambahkan indeks ke basis data Drupal aman?

12

Saya telah mencari dan membaca tentang ini, tetapi saya belum melihat sesuatu yang pasti tentang topik menambahkan indeks ke tabel Drupal (baik core dan contrib).

Perhatian utama saya adalah apa yang terjadi dengan indeks kustom ketika Anda memperbarui kode inti atau contrib dan ada perubahan skema. Apa yang terjadi dalam kasus ini?

EDIT:

Saya pikir beberapa konteks dapat membantu. Saya terutama prihatin dengan menambahkan indeks ke tabel untuk menyesuaikan kinerja situs (pertanyaan muncul di log kueri lambat, halaman dengan tampilan lambat, dll). Ini mungkin melibatkan menambahkan indeks ke tabel dalam modul orang lain. Sebagai contoh

  1. Saya memasang modul foo
  2. Modul foo membuat tabel foo
  3. Saya menambahkan indeks ke tabel foo
  4. Modul foomemiliki pembaruan yang mengubah skema

Apa yang terjadi?

mpdonadio
sumber

Jawaban:

7

Ya, itu bisa menimbulkan masalah.

Jika modul ingin melakukan sesuatu dengan kolom yang telah Anda tambahkan indeks, itu akan menghapus indeks itu sendiri dan kemudian melakukan operasi apa pun yang ingin dilakukan.

Apa yang sebenarnya akan terjadi akan tergantung pada jenis database Anda dan operasi yang sebenarnya dijalankan. Misalnya, mengganti nama kolom akan berfungsi dengan baik dengan MySQL, tetapi akan gagal pada PostgreSQL. Tetapi jika ia mencoba untuk menghapus kolom itu (mungkin setelah memigrasikan data ke tabel / colun yang berbeda), itu akan gagal.

Kemungkinan bahwa ini akan terjadi relatif rendah, setidaknya untuk update minor (tidak tergantung pada modul yang sebenarnya namun. Saya biasanya tidak menambahkan setiap perubahan yang bisa memecah sesuatu untuk rilis minor), tapi mungkin.

Saran saya adalah agar Anda mencoba bekerja sama dengan pengelola modul. Jika kueri bermasalah berasal dari modul itu sendiri, maka pengelola mungkin akan dengan senang hati menambahkan indeks, jika Anda memberikan tambalan. Berikan DESCRIBE output dari query yang bermasalah sebelum dan sesudah menambahkan indeks. Juga berikan tambalan yang memperbarui skema (termasuk fungsi pembaruan untuk mengaturnya untuk instalasi yang ada).

Seseorang yang secara aktif mengerjakan hal-hal yang berkaitan dengan kinerja dan melakukan hal-hal di atas dengan sangat baik adalah menangkap, berikut ini sebuah contoh: http://drupal.org/node/983950

Berdir
sumber
2

Seperti yang dilaporkan dalam DatabaseSchema_pgsql :: changeField , dan di db_change_field () :

CATATAN PENTING: Untuk menjaga portabilitas basis data, Anda harus secara eksplisit membuat kembali semua indeks dan kunci utama yang menggunakan bidang yang diubah.

Itu berarti Anda harus membuang semua kunci dan indeks yang terpengaruh dengan db_drop_ {primary_key, unique_key, index} () sebelum memanggil db_change_field (). Untuk membuat ulang kunci dan indeks, berikan definisi kunci sebagai argumen opsional $ new_keys langsung ke db_change_field ().

Misalnya, anggap Anda memiliki:

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

dan Anda ingin mengubah foo.bar menjadi tipe serial, meninggalkannya sebagai kunci utama. Urutan yang benar adalah:

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

Kode serupa dilaporkan untuk Drupal 7.

Ingatlah bahwa, untuk pengalaman saya, Anda tidak dapat menghapus kunci utama yang menggunakan bidang serial. Pada Drupal 6, saya mendapatkan kesalahan setiap kali saya mencoba melakukan itu; Saya tidak mencobanya pada Drupal 7.

Selain itu, saya tidak tahu masalah lain yang Anda miliki dengan indeks basis data.

Tentang menambahkan indeks ke tabel database yang dibuat dari modul lain, saya tidak akan menyarankan melakukan itu, karena:

  • Modul tidak menjatuhkan indeks untuk bidang yang sedang diubah, jika modul itu sendiri tidak membuat indeks itu. Tidak mungkin bagi modul untuk melakukan itu karena tidak tahu nama indeks.
  • Memodifikasi tabel database yang dibuat oleh modul lain tidak pernah merupakan ide yang baik, bahkan dalam kasus modul adalah modul inti. Jika ada modul lain yang mengubah tabel yang sama, bagaimana modul dapat menangani konflik yang mereka miliki satu sama lain, atau dengan perubahan modul inti akan berlaku untuk database sendiri?

Jika tabel database sedang dibuat dari modul lain (modul inti atau modul pihak ketiga), saya akan menyarankan untuk membuka permintaan fitur untuk modul, menyediakan kasus penggunaan untuk menggunakan indeks baru; jika ada masalah kinerja, menambahkan indeks bisa menjadi hal yang diinginkan untuk dilakukan.

Jika Anda akan menambahkan indeks ke tabel yang dibuat dari modul lain ke situs Anda sendiri, maka bersiaplah untuk setiap perubahan yang perlu Anda lakukan pada modul khusus Anda setiap kali modul diperbarui, dan sebelum Anda menginstalnya di situs Anda sendiri .
Andalah yang dapat memutuskan apakah pekerjaan ekstra itu sepadan dengan kinerja yang Anda dapatkan. Secara pribadi, saya pikir itu tidak layak.

kiamlaluno
sumber
Terima kasih. Bagaimana ini bekerja jika saya menambahkan indeks ke tabel untuk mengatasi permintaan yang lambat, bukan hanya perubahan pada modul saya sendiri? Saya akan mencoba mengedit pertanyaan saya menjadi sedikit lebih jelas ketika saya mendapat kesempatan.
mpdonadio
3
Anda juga dapat mempertimbangkan menggunakan DB Tuner yang berguna untuk mengetahui indeks mana yang akan dibuat.
tostinni
@tostinni Ya, pertanyaan itu hampir langsung terkait dengan menerapkan rekomendasi dari DB Tuner.
mpdonadio