Database Drupal innodb atau MyISAM?

10

Saya memiliki situs Drupal, dan saya menderita masalah kinerja. Saya menemukan Bagaimana cara mengubah database dari MyISAM ke InnoDB? menunjukkan bahwa kinerja dapat meningkat dengan beralih.

Bagaimana saya bisa tahu apakah database MySQL saya adalah InnoDB, atau MyISAM?

chrisjlee
sumber
1
Jenis tabel tidak terikat pada katalog. Anda dapat memiliki katalog dengan campuran tabel MyISAM dan InnoDB di dalamnya.
mpdonadio
2
Meskipun ada manfaat untuk optimasi pada level itu, saya sangat ragu mengubah tipe tabel akan memperbaiki masalah kinerja Anda. Perbedaannya tidak begitu besar.
Letharion
1
@ Chris J. Lee, itu benar. Jenis tabel pencampuran dapat digunakan untuk alasan kinerja, atau untuk mengeksploitasi fitur hanya tersedia untuk jenis tabel tertentu (misalnya, pencarian FULLTEXT dengan tabel MyISAM). Ini juga dapat terjadi secara tidak sengaja jika Anda mengubah default mysqld dan membuat lebih banyak tabel dalam katalog :)
mpdonadio
2
Letharion: itu tidak benar. Jenis tabel dan cara mysql dikonfigurasi untuknya berdampak besar pada kinerja!
Walter Heck
2
@Letharion: Faktanya, mengesampingkan perbaikan arsitektur, peningkatan kinerja yang sangat besar dalam hal hal-hal seperti konkurensi dengan SELECT dan UPDATE campuran — suatu UPDATE akan mengunci tabel di MyISAM, tetapi hanya satu baris di InnoDB — berarti peningkatan kinerja yang besar dapat terlihat dengan tidak lebih dari mengganti mesin meja. Sekarang, jika Anda melakukan kueri konyol, maka Anda melakukan kueri konyol, dan mengubah tipe tabel tidak akan membantu. Tetapi untuk mengabaikan mesin ganti dari tangan juga tidak benar.
BMDan

Jawaban:

8

Anda dapat menjalankan kueri khusus:

SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'

untuk membuat daftar semua tabel di database Anda dan mesin yang digunakan untuk masing-masing.

Atau Anda bisa login ke database Anda menggunakan phpMyAdmin dan pilih database Anda ... Anda akan melihat mesin di Typekolom dalam daftar tabel.

Secara pribadi saya akan merekomendasikan Navicat untuk MySQL , ini adalah MySQL GUI yang sangat bagus dan membuat mengetahui hal-hal seperti ini sangat mudah.

Sumber: http://www.electrictoolbox.com/mysql-table-storage-engine/

Clive
sumber
Alat MySQL Administrator yang lama juga berfungsi dengan baik untuk hal-hal seperti ini. Jika Anda melihat-lihat situs web MySQL Anda masih dapat menemukan penginstalnya.
mpdonadio
@MPD Wow apakah itu masih berjalan? Harus mengunduh itu walaupun hanya untuk sedikit nostalgia :)
Clive
Administrator dan Browser Kueri secara resmi tidak digunakan dan tidak didukung sekarang, tetapi Anda masih dapat mengunduhnya. Saya benci Workbench, dan masih menggunakan ini.
mpdonadio
Untuk melihat output yang mirip dengan apa yang Anda lihat di phpMyAdmin di baris perintah, gunakan SHOW TABLE STATUS. Untuk mendapatkan hitungan sederhana dari berapa banyak tabel di setiap jenis mesin, itu SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINE.
BMDan
6

Pengalaman terbaik saya adalah memutuskan berdasarkan tabel. InnoDB bagus, karena dapat menghindari penguncian tabel (tidak ada proses lain yang dapat membaca dari tabel saat satu proses menulis), tetapi performanya sangat buruk dengan COUNT () yang sering digunakan untuk kueri pager.

(Sunting: silakan lihat komentar Clives di bawah)

Ada juga implikasi pada pengaturan MySQL Anda, tergantung DB mana yang Anda gunakan. Jika Anda memiliki akses ke server, mysqltuner harus menjadi langkah pertama Anda, untuk memeriksa konfigurasi:

https://github.com/rackerhacker/MySQLTuner-perl#readme

Martin
sumber
2
1 Saya tidak tahu InnoDB lambat untuk COUNTquery, menurut artikel ini dengan mantan manajer High Performance Group untuk MySQL meskipun hanya benar-benar mempengaruhi permintaan mengandung COUNT(*) tanpa sebuah WHEREklausa.
Clive
3
Alasannya adalah bahwa MyISAM mempertahankan nilai per-tabel untuk jumlah baris dalam tabel, yang berarti bahwa sederhana SELECT COUNT(*) FROM tabledapat kembali secara instan dengan nilai itu. InnoDB tidak, jadi harus memindai seluruh indeks kunci utama. Yang mengatakan, sementara Drupal melakukan banyak hal SELECT COUNT(*), saya hanya bisa memikirkan satu tempat di seluruh kode yang melakukannya tanpa WHEREklausa. Jadi, jangan gunakan MyISAM karena khawatir untuk edgecase khusus ini. InnoDB dengan kumpulan buffer ukuran yang layak akan lebih cepat untuk semua permintaan dunia nyata.
BMDan
6

Hanya mencoba hal-hal untuk mendapatkan situs web lebih cepat seperti mobil yang berubah secara membabi buta dan berharap Anda mendapatkan yang lebih cepat di lain waktu.

Pertama-tama coba buah-buahan yang menggantung rendah, jika tidak membantu, cobalah untuk menemukan hambatan yang sebenarnya.

  1. Apakah Anda mengaktifkan mekanisme bawaan: caching halaman (hanya efektif untuk pengguna anonim), persetujuan CSS dan JS?
  2. Jika host Anda menawarkan cache opcode seperti APC, hidupkan.
  3. Siapkan Drupal Anda secara lokal, termasuk DB lengkap.
  4. Pastikan Anda menjalankan XDebug.
  5. Mulailah melakukan profil kinerja nyata. Dengan cara ini Anda dapat mengidentifikasi bagian mana dari situs web Anda yang menghabiskan banyak waktu. Semakin lambat situs web Anda, semakin mudah untuk menemukan kode / komponen yang salah.

Seringkali itu hanya permintaan DB lambat yang membutuhkan indeks, atau modul melakukan sesuatu dengan lambat.

Saya juga menemukan perbedaan besar antara hosters. Jika Anda memasang drupal baru di luar kotak, apakah kinerjanya oke? Jika tidak, ini saatnya mencari hoster lain.

BetaRide
sumber
5

FWIW situs Drupal 6.x hampir 20K node kami mengalami beberapa masalah kinerja dan saya memilih untuk memindahkan semua tabel ke InnoDB. Itu mudah dan cara saya mengatasinya adalah menggunakan mysqldump untuk membuang semua konten ke file sql, menggunakan editor (sed) untuk mengganti semua kemunculan MyISAM ke InnoDB kemudian memuat kembali database dari file itu. Salah satu sisi bawahnya adalah bahwa Anda tidak dapat memulihkan ruang dari database InnoDB (IIRC) tetapi selama Anda menyimpan tabel duplikat Anda dalam DB terpisah Anda seharusnya tidak memiliki masalah. Oh, dan kami memang melihat peningkatan kinerja yang signifikan. Dan karena kami memiliki empat contoh Drupal, banyaknya file tabel dihapus dari sistem file (ya, mereka terdapat di dalam file InnoDB itu sendiri). Ini adalah nilai $ 0,02 saya.

bobmct
sumber
2
Memiliki satu tablespace InnoDB dapat menghemat inode, tetapi (seperti yang Anda sebutkan sendiri) dengan mengorbankan ruang disk. Bahkan jika Anda menghapus banyak data, Anda tidak akan bisa mendapatkan kembali ruang disk tersebut. Ini juga menghasilkan file cadangan besar yang tidak perlu dan tidak dapat mengembalikan tabel tunggal. Itu sebabnya saya lebih suka menggunakan innodb_file_per_tableopsi.
geewiz
1
Juga, Anda dapat mengkonversi tabel di tempat: for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done. Tambahkan opsi yang sesuai ( -uroot -psomepass, misalnya) ke keduanya mysqljika diperlukan.
BMDan
5

Hanya kepala. Jika Anda menggunakan Drupal 6, Anda dapat menginstal modul DBTuner ; itu dapat dengan mudah memindahkan tabel Anda dari MyISAM ke InnoDB. Jadi ya, ada modul untuk itu!

mikeytown2
sumber