Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Kinerja MySQL:MyISAM vs InnoDB

Faktor utama dalam kinerja database adalah mesin penyimpanan yang digunakan oleh database, dan lebih khusus lagi, tabelnya. Mesin penyimpanan yang berbeda memberikan kinerja yang lebih baik dalam satu situasi di atas yang lain. Untuk penggunaan umum, ada dua pesaing yang harus dipertimbangkan. Ini adalah MyISAM, yang merupakan mesin penyimpanan default MySQL, atau InnoDB, yang merupakan mesin alternatif bawaan MySQL yang ditujukan untuk database berkinerja tinggi. Sebelum kita dapat memahami perbedaan antara kedua mesin penyimpanan, kita perlu memahami istilah “penguncian”.

Apa yang mengunci di MySQL?

Untuk melindungi integritas data yang disimpan dalam database, MySQL menggunakan penguncian. Mengunci, sederhananya, berarti melindungi data agar tidak diakses. Saat kunci diterapkan, data tidak dapat diubah kecuali dengan kueri yang memulai kunci. Penguncian adalah komponen yang diperlukan untuk memastikan keakuratan informasi yang disimpan. Setiap storage engine memiliki metode penguncian yang berbeda-beda. Bergantung pada data dan praktik kueri Anda, satu mesin dapat mengungguli yang lain. Dalam seri ini, kita akan melihat dua jenis penguncian yang paling umum digunakan oleh dua mesin penyimpanan kita.

Penguncian tabel: Teknik mengunci seluruh tabel ketika satu atau lebih sel dalam tabel perlu diperbarui atau dihapus. Penguncian tabel adalah metode default yang digunakan oleh mesin penyimpanan default, MyISAM.

Contoh:Penguncian Tabel MyISAM Kolom A Kolom B Kolom C
PERBARUI 1 Kueri Baris 1 Menulis data data
Kueri 2 PILIH (Tunggu) Baris 2 data data data
Perbarui Kueri 3 (Tunggu) Baris 3 data data data
Kueri 4 PILIH (Tunggu) Baris 4 data data data
Kueri 5 PILIH (Tunggu) Baris 5 data data data
Contoh mengilustrasikan bagaimana satu operasi tulis mengunci seluruh tabel yang menyebabkan kueri lain menunggu kueri UPDATE selesai.

Penguncian tingkat baris: Tindakan mengunci rentang baris yang efektif dalam tabel saat satu atau lebih sel dalam rentang tersebut diubah atau dihapus. Penguncian tingkat baris adalah metode yang digunakan oleh mesin penyimpanan InnoDB dan ditujukan untuk database berperforma tinggi.

Contoh:Penguncian Tingkat Baris InnoDB Kolom A Kolom A Kolom A
PERBARUI 1 Kueri Baris 1 Menulis data data
Kueri 2 PILIH Baris 2 Membaca data data
PERBARUI Kueri 3 Baris 3 data Menulis data
Kueri 4 PILIH Baris 4 Membaca Membaca Membaca
Kueri 5 PILIH Baris 5 Membaca data Membaca
Contoh menunjukkan bagaimana menggunakan penguncian tingkat baris memungkinkan beberapa kueri dijalankan pada baris individual dengan mengunci hanya baris yang diperbarui, bukan seluruh tabel.

MyISAM vs. InnoDB

Dengan membandingkan dua mesin penyimpanan, kita sampai pada inti argumen antara menggunakan InnoDB melalui MyISAM. Aplikasi atau situs web yang memiliki tabel yang sering digunakan bekerja dengan sangat baik menggunakan mesin penyimpanan InnoDB dengan mengatasi kemacetan penguncian tabel. Namun, pertanyaan menggunakan satu di atas yang lain adalah subjektif karena tidak satu pun dari mereka yang sempurna dalam semua situasi. Ada kekuatan dan keterbatasan untuk kedua mesin penyimpanan. Pengetahuan mendalam tentang struktur database dan praktik kueri sangat penting untuk memilih mesin penyimpanan terbaik untuk tabel Anda.

MyISAM akan mengungguli InnoDB pada tabel besar yang membutuhkan lebih banyak aktivitas membaca dibandingkan aktivitas menulis. Keterbacaan MyISAM mengungguli InnoDB karena mengunci seluruh tabel lebih cepat daripada mencari tahu baris mana yang dikunci dalam tabel. Semakin banyak informasi dalam tabel, semakin banyak waktu yang dibutuhkan InnoDB untuk mengetahui mana yang tidak dapat diakses. Jika aplikasi Anda bergantung pada tabel besar yang tidak sering mengubah data, maka MyISAM akan mengungguli InnoDB. Sebaliknya, InnoDB mengungguli MyISAM ketika data dalam tabel sering berubah. Tabel lebih banyak mengubah data tulis daripada membaca data per detik. Dalam situasi ini, InnoDB dapat memenuhi permintaan dalam jumlah besar dengan lebih mudah daripada mengunci seluruh tabel untuk masing-masing permintaan.

Haruskah saya menggunakan InnoDB dengan Situs WordPress, Magento, atau Joomla?

Jawaban singkatnya di sini adalah ya, dalam banyak kasus. Manusia Paling Bermanfaat dari Liquid Web dalam Tim Dukungan Hosting telah mengalami beberapa hambatan penguncian tabel saat klien menggunakan beberapa aplikasi web standar saat ini. Sebagian besar pengguna aplikasi pihak ketiga yang populer seperti WordPress, Magento, dan Joomla memiliki pengetahuan terbatas tentang komponen basis data atau kode yang terlibat untuk membuat keputusan yang tepat tentang mesin penyimpanan. Sebagian besar hambatan penguncian tabel dari sistem pengelolaan konten (CMS) ini umumnya diselesaikan dengan mengubah semua tabel untuk situs ke InnoDB, bukan MyISAM default. Jika Anda menghosting banyak jenis CMS ini di server Anda, akan bermanfaat untuk mengubah mesin penyimpanan default di MySQL untuk menggunakan InnoDB untuk semua tabel baru sehingga setiap instalasi tabel baru dimulai dengan InnoDB.

Menyetel Mesin Penyimpanan Default

Setel mesin penyimpanan default Anda ke InnoDB dengan menambahkan default_storage_engine=InnoDB ke [mysqld] bagian dari file konfigurasi sistem yang terletak di: /etc/my.cnf. Restart layanan MySQL diperlukan agar server dapat mendeteksi perubahan pada file.

~ $ cat /etc/my.cnf
[mysqld]
log-error=/var/lib/mysql/mysql.err
innodb_file_per_table=1
default-storage-engine=innodb
innodb_buffer_pool_size=128M

Mengonversi Semua Tabel Antara MyISAM dan InnoDB

Sayangnya, MySQL tidak memiliki opsi untuk mengonversi tabel, sehingga setiap tabel dapat diubah satu per satu. Tim dukungan Liquid Web telah menyusun rencana pemeliharaan yang mudah diikuti untuk proses ini. Skrip, yang dapat Anda jalankan di server yang diperlukan melalui akses shell (SSH) akan mengonversi semua tabel antar mesin penyimpanan.

NotePlan sesuai saat melakukan operasi batch seperti ini untuk berjaga-jaga jika terjadi downtime. Praktik terbaik adalah mencadangkan semua Database MySQL Anda sebelum menerapkan perubahan sebesar ini, hal ini akan memberikan titik pemulihan yang mudah untuk mencegah kehilangan data.

Langkah 1:  Persiapan

Rencanakan untuk memulai pada saat waktu henti dengan konsekuensi minimal. Proses ini sendiri tidak memerlukan waktu henti, namun, waktu henti mungkin diperlukan untuk pulih dari keadaan yang tidak terduga.

Langkah 2:  Backup Semua Database Ke File

Perintah di bawah ini membuat satu file cadangan dari semua database bernama all-databases-backup.sqld dan dapat dihapus setelah konversi berhasil dan tidak ada masalah yang terlihat.
mysqldump --all-databases > all-databases-backup.sql

Langkah 3:  Rekam Mesin Tabel yang Ada Ke File

Jalankan skrip berikut untuk merekam mesin tabel yang ada ke file bernama table-engine-backup.sql . Anda kemudian dapat "mengimpor" atau "menjalankan" file ini nanti untuk mengonversi kembali ke mesin aslinya jika perlu.

mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=",Engine,";") FROM information_schema.tables WHERE table_schema NOT IN("mysql","information_schema","performance_schema");' | tee table-engine-backup.sql

Jika Anda perlu mengembalikan mesin tabel karena alasan apa pun, jalankan:
mysql < table-engine-backup.sql

Langkah 4a:  Konversi Tabel MyISAM Ke ​​InnoDB

Perintah di bawah ini akan dilanjutkan bahkan jika sebuah tabel gagal dan memberi tahu Anda tabel mana yang gagal dikonversi. Outputnya disimpan ke file bernama convert-to-innodb.log untuk ulasan nantiw.
mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=InnoDB;") FROM information_schema.tables WHERE table_schema NOT IN ("mysql","information_schema","performance_schema") AND Engine = "MyISAM";' | while read -r i; do echo $i; mysql -e "$i"; done | tee convert-to-innodb.log

Langkah 4b:Konversikan Semua Tabel InnoDB Ke MyISAM

Perintah ini akan dilanjutkan bahkan jika sebuah tabel gagal dan memberi tahu Anda tabel mana yang gagal dikonversi. Outputnya juga disimpan ke file bernama convert-to-myisam.log untuk ditinjau nanti.

mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=MyISAM;") FROM information_schema.tables WHERE table_schema NOT IN ("mysql","information_schema","performance_schema") AND Engine = "InnoDB";' | while read -r i; do echo $i; mysql -e "$i"; done | tee convert-to-myisam.log

Mengonversi Satu Tabel Antara MyISAM dan InnoDB

Perintah berikut mengilustrasikan bagaimana mengonversi satu tabel dilakukan.

CatatanGanti database_name dengan nama database yang tepat dan table_name dengan nama tabel yang benar. Pastikan Anda memiliki cadangan tabel yang valid sebelum melanjutkan.

Mencadangkan Satu Tabel Ke File
mysqldump database_name table_name > backup-table_name.sql

Mengonversi Satu Tabel Menjadi InnoDB

mysql -Bse ‘ALTER TABLE database_name.table_name ENGINE=InnoDB;’

Mengonversi Satu Tabel Menjadi MyISAM:

mysql -Bse ‘ALTER TABLE database_name.table_name ENGINE=MyISAM;’

Lihat artikel kami yang lain dalam seri ini, Kinerja MySQL:Mengidentifikasi Kueri Panjang, untuk menunjukkan kueri lambat dalam database Anda. Nantikan artikel kami berikutnya yang akan membahas caching dan pengoptimalan.

Navigasi Seri<>

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hitung Usia di MySQL (InnoDb)

  2. Duplikat, Salin, atau Cadangkan Tabel di MySQL, MariaDB, Oracle, PostgreSQL, DB2 dan SQLite dengan Create Table As SQL

  3. Bisakah saya mencampur API MySQL di PHP?

  4. mysqli:dapatkah ia menyiapkan banyak kueri dalam satu pernyataan?

  5. phpMyAdmin - tidak dapat terhubung - pengaturan tidak valid - sejak saya menambahkan kata sandi root - terkunci