it-swarm.asia

Apa perbedaan utama antara InnoDB dan MyISAM?

Apa perbedaan utama antara InnoDB dan MyISAM?

255
ilhan

Perbedaan utama pertama yang saya lihat adalah InnoDB mengimplementasikan kunci tingkat baris sedangkan MyISAM hanya dapat melakukan kunci tingkat meja. Anda akan menemukan pemulihan kerusakan yang lebih baik di InnoDB. Namun, itu tidak memiliki indeks pencarian FULLTEXT sampai v5.6, seperti halnya MyISAM. InnoDB juga menerapkan transaksi, kunci asing dan batasan hubungan sementara MyISAM tidak.

Daftar ini bisa sedikit lebih jauh. Namun, mereka berdua memiliki kelebihan unik dalam mendukung dan merugikan satu sama lain. Masing-masing lebih cocok dalam beberapa skenario daripada yang lain.

Jadi untuk meringkas (TL; DR):

  • InnoDB memiliki penguncian level-baris, MyISAM hanya dapat melakukan penguncian level-tabel penuh.
  • InnoDB memiliki pemulihan kerusakan yang lebih baik.
  • MyISAM memiliki FULLTEXT indeks pencarian, InnoDB tidak sampai MySQL 5.6 (Feb 2013).
  • InnoDB mengimplementasikan transaksi, kunci asing dan batasan hubungan, MyISAM tidak.
165
poelinca

Perbedaan utama lainnya yang belum disebutkan adalah bagaimana caching untuk setiap mesin penyimpanan dilakukan.

[~ # ~] myisam [~ # ~]

Mekanisme utama yang digunakan adalah cache kunci. Hanya cache halaman indeks dari file .MYI. Untuk mengukur cache kunci Anda, jalankan kueri berikut:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;

Ini akan memberikan Pengaturan yang Disarankan untuk Cache Kunci MyISAM ( key_buffer_size ) diberikan kumpulan data Anda saat ini ( kueri akan membatasi rekomendasi pada 4G (4096M). Untuk OS 32-bit, 4GB adalah batasnya. Untuk 64-bit, 8GB.

InnoDB

Mekanisme utama yang digunakan adalah Buffer Pool InnoDB. Tembolok data dan indeks halaman dari tabel InnoDB diakses. Untuk mengukur Kelompok Penyangga InnoDB Anda, jalankan kueri berikut:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;

Ini akan memberikan Pengaturan yang Dianjurkan untuk ukuran Pool Buffer InnoDB ( innodb_buffer_pool_size ) diberikan kumpulan data Anda saat ini.

Jangan lupa untuk mengubah ukuran File Log InnoDB (ib_logfile0 dan ib_logfile1). Kode Sumber MySQL menempatkan batas ukuran gabungan dari semua File Log InnoDB harus <4G (4096M). Demi kesederhanaan, hanya dengan dua file log, berikut adalah cara Anda dapat mengukurnya:

  • Langkah 1) Tambahkan innodb_log_file_size = NNN ke /etc/my.cnf (NNN harus 25% dari innodb_buffer_pool_size atau 2047M, yang mana lebih kecil)
  • Langkah 2) service mysql stop
  • Langkah 3) rm /var/log/mysql/ib_logfile[01]
  • Langkah 4) service mysql start (ib_logfile0 dan ib_logfile1 diciptakan kembali)

[~ # ~] peringatan [~ # ~]

Di Akhir dari kedua kueri adalah Permintaan Inline (SELECT 2 PowerOf1024) B

  • (SELECT 0 PowerOf1024) memberikan Pengaturan dalam Bytes
  • (SELECT 1 PowerOf1024) memberikan Pengaturan dalam Kilobyte
  • (SELECT 2 PowerOf1024) memberikan Pengaturan dalam Megabita
  • (SELECT 3 PowerOf1024) memberikan Pengaturan dalam Gigabytes
  • Tidak ada kekuatan kurang dari 0 atau lebih dari 3 yang diterima

[~ # ~] epilog [~ # ~]

Tidak ada pengganti untuk akal sehat. Jika Anda memiliki memori terbatas, campuran mesin penyimpanan, atau kombinasinya, Anda harus menyesuaikan skenario yang berbeda.

  • Jika Anda memiliki 2GB RAM dan InnoDB 16GB, alokasikan 512M sebagai innodb_buffer_pool.
  • Jika Anda memiliki 2GB RAM dan 4GB Indeks MyISAM, alokasikan 512M sebagai key_buffer_size.
  • Jika Anda memiliki 2GB RAM dan 4GB Indeks MyISAM dan InnoDB 16GB, alokasikan 512M sebagai key_buffer_size dan 512M sebagai innodb_buffer_pool_size.

Skenario yang mungkin tidak terbatas !!!

Ingat, apa pun yang Anda alokasikan, biarkan cukup RAM untuk Koneksi DB dan Sistem Operasi.

89
RolandoMySQLDBA

InnoDB menawarkan:

  • Transaksi ASAM
  • penguncian tingkat baris
  • batasan kunci asing
  • pemulihan crash otomatis
  • kompresi tabel (baca/tulis)
  • tipe data spasial (tidak ada indeks spasial)

Di InnoDB semua data berturut-turut kecuali TEXT dan BLOB dapat menempati paling banyak 8.000 byte. Pengindeksan teks lengkap tidak tersedia di InnoDB hingga MySQL 5.6 (Feb 2013). Di InnoDB COUNT(*) s (ketika WHERE, GROUP BY, Atau JOIN tidak digunakan) jalankan lebih lambat daripada di MyISAM karena jumlah baris tidak disimpan secara internal . InnoDB menyimpan data dan indeks dalam satu file. InnoDB menggunakan kumpulan buffer untuk menyimpan data dan indeks.

MyISAM menawarkan:

  • fast COUNT(*) s (ketika WHERE, GROUP BY, atau JOIN tidak digunakan)
  • pengindeksan teks lengkap (pembaruan: didukung di InnoDB dari MySQL 5.6)
  • jejak disk yang lebih kecil
  • kompresi tabel sangat tinggi (hanya baca)
  • tipe dan indeks data spasial (R-tree) (pembaruan: didukung di InnoDB dari MySQL 5.7)

MyISAM memiliki penguncian level-tabel, tetapi tidak ada penguncian level-baris. Tidak ada transaksi. Tidak ada pemulihan kerusakan otomatis, tetapi tidak menawarkan fungsi tabel perbaikan. Tidak ada batasan kunci asing. Tabel MyISAM umumnya lebih kompak dalam ukuran pada disk jika dibandingkan dengan tabel InnoDB. Tabel MyISAM dapat semakin diperkecil ukurannya dengan mengompresi dengan myisampack jika diperlukan, tetapi menjadi read-only. MyISAM menyimpan indeks dalam satu file dan data di file lain. MyISAM menggunakan buffer kunci untuk indeks caching dan membiarkan manajemen caching data ke sistem operasi.

Secara keseluruhan saya akan merekomendasikan InnoDB untuk sebagian besar keperluan dan MyISAM hanya untuk penggunaan khusus. InnoDB sekarang menjadi mesin default di versi MySQL baru.

63
dabest1

Agak terlambat untuk permainan ... tapi di sini cukup komprehensif posting saya menulis beberapa bulan lal , merinci perbedaan utama antara MYISAM dan InnoDB. Raih secangkir teh (dan mungkin biskuit), dan nikmati.


Perbedaan utama antara MyISAM dan InnoDB adalah dalam integritas referensial dan transaksi. Ada juga perbedaan lain seperti penguncian, kembalikan, dan pencarian teks lengkap.

Integritas referensial

Integritas referensial memastikan bahwa hubungan antar tabel tetap konsisten. Lebih khusus lagi, ini berarti ketika sebuah tabel (mis. Listing) memiliki kunci asing (mis. ID Produk) yang menunjuk ke tabel yang berbeda (mis. Produk), ketika pembaruan atau penghapusan terjadi pada tabel menunjuk-ke, perubahan-perubahan ini mengalir ke penautan meja. Dalam contoh kami, jika suatu produk diganti namanya, kunci asing tabel penautan juga akan diperbarui; jika suatu produk dihapus dari tabel 'Produk', daftar apa pun yang mengarah ke entri yang dihapus juga akan dihapus. Selain itu, setiap listing baru harus memiliki kunci asing yang menunjuk ke entri yang ada dan valid.

InnoDB adalah DBMS relasional (RDBMS) dan dengan demikian memiliki integritas referensial, sedangkan MyISAM tidak.

Transaksi & Atomicity

Data dalam tabel dikelola menggunakan pernyataan Bahasa Manipulasi Data (DML), seperti SELECT, INSERT, UPDATE, dan DELETE. Grup transaksi yang menggabungkan dua atau lebih pernyataan DML menjadi satu unit kerja, sehingga seluruh unit diterapkan, atau tidak ada satu pun di antaranya.

MyISAM tidak mendukung transaksi sedangkan InnoDB tidak.

Jika operasi terganggu saat menggunakan tabel MyISAM, operasi dibatalkan segera, dan baris (atau bahkan data dalam setiap baris) yang terpengaruh tetap terpengaruh, bahkan jika operasi tidak selesai.

Jika operasi terganggu saat menggunakan tabel InnoDB, karena menggunakan transaksi, yang memiliki atomicity, setiap transaksi yang tidak selesai tidak akan berpengaruh, karena tidak ada komit dibuat.

Mengunci meja vs Mengunci baris

Ketika kueri berjalan terhadap tabel MyISAM, seluruh tabel di mana kueri akan dikunci. Ini berarti pertanyaan selanjutnya hanya akan dieksekusi setelah yang sekarang selesai. Jika Anda membaca tabel besar, dan/atau ada operasi baca dan tulis yang sering, ini bisa berarti tumpukan pertanyaan yang sangat besar.

Ketika kueri berjalan terhadap tabel InnoDB, hanya baris yang terlibat yang dikunci, sisa tabel tetap tersedia untuk operasi CRUD. Ini berarti kueri dapat berjalan secara bersamaan di tabel yang sama, asalkan mereka tidak menggunakan baris yang sama.

Fitur ini di InnoDB dikenal sebagai konkurensi. Sehebat konkurensi, ada kelemahan utama yang berlaku pada rentang tabel tertentu, di mana ada overhead dalam peralihan di antara thread kernel, dan Anda harus menetapkan batas pada thread kernel untuk mencegah server berhenti. .

Transaksi & Kembalikan

Saat Anda menjalankan operasi di MyISAM, perubahannya diatur; di InnoDB, perubahan itu dapat dibatalkan. Perintah yang paling umum digunakan untuk mengendalikan transaksi adalah COMMIT, ROLLBACK dan SAVEPOINT. 1. COMMIT - Anda dapat menulis beberapa operasi DML, tetapi perubahan hanya akan disimpan ketika KOMIT dibuat 2. ROLLBACK - Anda dapat membuang semua operasi yang belum dilakukan. 3. SAVEPOINT - menetapkan poin dalam daftar operasi yang dapat dikembalikan ke operasi ROLLBACK

Keandalan

MyISAM tidak menawarkan integritas data - Kegagalan perangkat keras, shutdown yang tidak bersih dan operasi yang dibatalkan dapat menyebabkan data menjadi rusak. Ini akan membutuhkan perbaikan penuh atau membangun kembali indeks dan tabel.

InnoDB, di sisi lain, menggunakan log transaksional, buffer penulisan ganda dan pemeriksaan otomatis dan validasi untuk mencegah korupsi. Sebelum InnoDB membuat perubahan, itu merekam data sebelum transaksi menjadi file tablespace sistem yang disebut ibdata1. Jika ada kerusakan, InnoDB akan melakukan autorecover melalui pemutaran ulang log tersebut.

Pengindeksan FULLTEXT

InnoDB tidak mendukung pengindeksan FULLTEXT hingga MySQL versi 5.6.4. Sampai tulisan ini dibuat, banyak versi MySQL penyedia hosting bersama masih di bawah 5.6.4, yang berarti pengindeksan FULLTEXT tidak didukung untuk tabel InnoDB.

Namun, ini bukan alasan yang sah untuk menggunakan MyISAM. Yang terbaik adalah beralih ke penyedia hosting yang mendukung versi MySQL terbaru. Bukan berarti tabel MyISAM yang menggunakan pengindeksan FULLTEXT tidak dapat dikonversi ke tabel InnoDB.

Kesimpulan

Kesimpulannya, InnoDB harus menjadi mesin penyimpanan pilihan Anda. Pilih MyISAM atau tipe data lain ketika mereka melayani kebutuhan tertentu.

32
d4nyll

Satu hal lagi: Anda dapat membuat cadangan tabel InnoDB hanya dengan mengambil snapshot dari sistem file. Mencadangkan MyISAM membutuhkan penggunaan mysqldump dan tidak dijamin konsisten (mis. Jika Anda memasukkan ke tabel induk dan tabel anak, Anda mungkin menemukan hanya baris tabel anak di cadangan Anda).

Pada dasarnya, jika Anda memiliki salinan data lain dan hanya menyimpannya di MySQL, mis. untuk memungkinkan cara standar mengaksesnya dari situs web PHP, maka MyISAM baik-baik saja (yaitu lebih baik daripada file CSV datar atau file log untuk kueri dan akses bersamaan). Jika database adalah "copy master" sebenarnya dari data, jika Anda melakukan INSERT dan UPDATE menggunakan data nyata dari pengguna, maka adalah bodoh untuk menggunakan apa pun selain InnoDB, pada skala apa pun MyISAM adalah tidak dapat diandalkan dan sulit dikelola, Anda akan melakukan myisamchk separuh waktu, meniadakan setiap kenaikan kinerja ...

(Pengalaman pribadi saya: DB 2 terabyte di MyISAM).

31
Gaius

Dalam pengalaman saya, perbedaan paling signifikan adalah cara masing-masing mesin menangani penguncian. InnoDB menggunakan penguncian baris sementara MyISAM menggunakan penguncian tabel. Sebagai aturan praktis, saya menggunakan InnoDB untuk menulis tabel berat dan MyISAM untuk membaca tabel berat.

Perbedaan penting lainnya termasuk:

  1. InnoDB mendukung transaksi dan kunci asing. MyISAM tidak.
  2. MyISAM menggunakan pengindeksan teks lengkap.
  3. MyISAM melakukan pekerjaan yang buruk dalam menegakkan integritas data.
19
bsoist

Saya cenderung melihat MyISAM sebagai pilihan tabel 'default' untuk MySQL, jadi saya akan menunjukkan perbedaan untuk sebagian besar pengguna InnoDB

  • Penguncian tingkat baris
  • Penegakan kunci asing
  • Dukungan transaksi
  • Kinerja sangat baik pada sistem penggunaan tinggi
9
Patrick

Termasuk perubahan MySQL 5.6

MESIN PENYIMPANAN INNODB:

  • Ini memberikan kepatuhan ACID (atomisitas, konsistensi, isolasi, daya tahan) penuh. Multi-versi digunakan untuk mengisolasi transaksi dari satu sama lain.
  • InnoDB menyediakan pemulihan otomatis setelah crash dari server MySQL atau Host tempat server berjalan.
  • InnoDB mendukung kunci asing dan integritas referensial, termasuk penghapusan cascaded dan pembaruan.
  • MySQL 5.6 dibangun di atas platform InnoDB yang sepenuhnya terintegrasi sebagai mesin penyimpanan default
  • Statistik Pengoptimal Persisten: Memberikan peningkatan akurasi statistik indeks InnoDB, dan konsistensi di seluruh restart MySQL.
  • Memangkas cache tabel InnoDB: Untuk memudahkan beban memori pada sistem dengan sejumlah besar tabel, InnoDB sekarang membebaskan memori yang terkait dengan tabel yang dibuka. Algoritma LRU memilih tabel yang telah berjalan paling lama tanpa diakses.
  • Mendukung pencarian teks lengkap: Jenis indeks khusus, indeks FULLTEXT, membantu InnoDB menangani kueri dan operasi DML yang melibatkan kolom berbasis teks dan kata-kata yang dikandungnya. Indeks ini secara fisik direpresentasikan sebagai seluruh tabel InnoDB.
  • InnoDB tampaknya jauh lebih cepat pada Pencarian Teks Lengkap daripada MyISAM

Jadi, tidak ada gunanya menggunakan MyISAM Engine jika Anda telah ditingkatkan ke 5.6, jika tidak maka jangan menunggu untuk meningkatkan ke MySQL 5.6.

Kinerja InnoDB VS MyISAM menggunakan MySQL 5.6

6
Mahesh Patil

MYISAM

MYISAM menyediakan penguncian level tabel, pencarian FULLTEXT. MYISAM memiliki kolom AUTO_INCREMENTED paling fleksibel yang menangani semua mesin penyimpanan. MYISAM tidak mendukung transaksi.

INNODB

INNODB adalah mesin penyimpanan yang aman untuk transaksi. INNODB memiliki kemampuan komit, kembalikan, dan pemulihan crash. INNODB mendukung integritas referensi kunci asing.

6
Anto

MyISAM

MyISAM adalah mesin penyimpanan untuk MySQL. Sebelum MySQL 5.5 itu adalah mesin penyimpanan default untuk MySQL. Ini didasarkan pada mesin penyimpanan ISAM yang lebih lama. MyISAM dioptimalkan untuk lingkungan dengan operasi baca yang berat, dan beberapa penulisan, atau tidak sama sekali. Alasan MyISAM memungkinkan untuk membaca cepat adalah struktur indexes: setiap entri menunjuk ke suatu record dalam file data, dan pointer diimbangi dari awal file. Dengan cara ini record dapat dengan cepat dibaca, terutama ketika formatnya TETAP. Dengan demikian, barisnya memiliki panjang konstan. area umum di mana orang dapat memilih MyISAM adalah data warehouse, karena melibatkan pertanyaan pada tabel yang sangat besar, dan pembaruan tabel tersebut dilakukan ketika database tidak digunakan (biasanya pada malam hari). Sisipan juga mudah, karena baris baru ditambahkan ke akhir file data. Namun, hapus dan perbarui operasi lebih bermasalah: penghapusan harus meninggalkan ruang kosong, atau offset baris akan berubah; hal yang sama berlaku untuk pembaruan, karena panjang baris menjadi lebih pendek; jika pembaruan membuat baris lebih panjang, baris terfragmentasi baris dan klaim ruang kosong, OPTIMIZE TABLE perintah harus dijalankan. Karena mekanisme sederhana ini, biasanya statistik indeks MyISAM cukup akurat. Kelemahan utama MyISAM lainnya adalah tidak adanya dukungan transaksi dan kunci asing.

InnoDB

InnoDB adalah mesin penyimpanan untuk MySQL. MySQL 5.5 dan yang lebih baru menggunakannya secara default. Ini memberikan fitur transaksi standar yang sesuai dengan ACID, bersama dengan dukungan kunci asing (Declarative Referential Integrity). Ini mengimplementasikan transaksi SQL dan XA, tablespace, FULLTEXT indeks, dan operasi spasial mengikuti standar OpenGIS. Ini dimasukkan sebagai standar dalam sebagian besar binari yang didistribusikan oleh MySQL AB, dengan pengecualian beberapa versi OEM. Perangkat lunak ini dilisensikan ganda oleh Oracle Corporation; itu didistribusikan di bawah Lisensi Publik Umum GNU, tetapi juga dapat dilisensikan kepada pihak yang ingin menggabungkan InnoDB dalam perangkat lunak berpemilik.

Garpu

MariaDB memiliki mesin penyimpanan yang disebut Aria, yang digambarkan sebagai "alternatif aman untuk MyISAM". MariaDB dan Percona Server menggunakan garpu InnoDB yang disebut XtraDB secara default. XtraDB dikelola oleh Percona. Perubahan Oracle InnoDB secara teratur diimpor ke XtraDB, dan beberapa perbaikan bug dan fitur tambahan ditambahkan.

4
wogsland