Apa perbedaan utama antara InnoDB dan MyISAM?
Apa perbedaan utama antara InnoDB dan MyISAM?
Jawaban:
Perbedaan utama pertama yang saya lihat adalah InnoDB mengimplementasikan kunci tingkat baris sementara MyISAM hanya dapat melakukan kunci tingkat meja. Anda akan menemukan pemulihan kerusakan yang lebih baik di InnoDB. Namun, itu tidak memiliki FULLTEXT
indeks pencarian hingga v5.6, seperti halnya MyISAM. InnoDB juga mengimplementasikan 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 ):
FULLTEXT
indeks pencarian, InnoDB tidak sampai MySQL 5.6 (Feb 2013).version 5.6.4
InnoDB mendukung FULLTEXT
pencarian. dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html
Perbedaan utama lainnya yang belum disebutkan adalah bagaimana caching untuk setiap mesin penyimpanan dilakukan.
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 ) yang diberikan pada kumpulan data Anda saat ini ( kueri akan membatasi rekomendasi pada 4G (4096M). Untuk OS 32-bit, batasnya 4GB. Untuk 64-bit, 8GB.
Mekanisme utama yang digunakan adalah Buffer Pool InnoDB. Itu cache data dan halaman indeks 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 ) mengingat 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:
service mysql stop
rm /var/log/mysql/ib_logfile[01]
service mysql start
(ib_logfile0 dan ib_logfile1 diciptakan kembali)Di Akhir kedua kueri adalah Kueri 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 GigabytesTidak ada pengganti untuk akal sehat. Jika Anda memiliki memori terbatas, campuran mesin penyimpanan, atau kombinasinya, Anda harus menyesuaikan skenario yang berbeda.
Skenario yang mungkin tidak terbatas !!!
Ingat, apa pun yang Anda alokasikan, sisakan RAM yang cukup untuk Koneksi DB dan Sistem Operasi.
InnoDB menawarkan:
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) mengeksekusi 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:
COUNT(*)
s (ketika WHERE
, GROUP BY
atau JOIN
tidak digunakan)MyISAM memiliki penguncian level-tabel, tetapi tidak ada penguncian level-baris. Tidak ada transaksi. Tidak ada pemulihan kerusakan otomatis, tetapi memang menawarkan fungsionalitas 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 dikurangi 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.
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 (misalnya jika Anda memasukkan ke tabel induk dan tabel anak, Anda mungkin hanya menemukan baris tabel anak dalam cadangan Anda).
Pada dasarnya, jika Anda memiliki salinan data lain dan hanya menyimpannya di MySQL misalnya 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 "salinan master" sebenarnya dari data, jika Anda melakukan INSERT
dan UPDATE
menggunakan data nyata dari pengguna, maka bodoh menggunakan apa pun selain InnoDB, pada skala apa pun, MyISAM tidak dapat diandalkan dan sulit dikelola, Anda akan melakukan myisamchk
separuh waktu, meniadakan setiap kenaikan kinerja ...
(Pengalaman pribadi saya: DB 2 terabyte di MyISAM).
Agak terlambat untuk permainan ... tapi di sini ada posting yang cukup komprehensif yang saya tulis beberapa bulan yang lalu , 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 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', setiap daftar 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.
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 yang sama sekali.
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.
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 dalam InnoDB ini 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. .
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
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 serta validasi untuk mencegah korupsi. Sebelum InnoDB melakukan perubahan, ia merekam data sebelum transaksi menjadi file tablespace sistem yang disebut ibdata1. Jika ada kerusakan, InnoDB akan melakukan autorecover melalui pemutaran ulang log tersebut.
InnoDB tidak mendukung pengindeksan FULLTEXT hingga MySQL versi 5.6.4. Pada penulisan posting ini, 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.
Kesimpulannya, InnoDB harus menjadi mesin penyimpanan pilihan Anda. Pilih MyISAM atau tipe data lain ketika mereka melayani kebutuhan tertentu.
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:
FULLTEXT
dan SPATIAL
. InnoDB baik untuk kedua beban read dan write-berat.
Saya cenderung melihat MyISAM sebagai pilihan tabel 'default' untuk MySQL, jadi saya akan menunjukkan perbedaan untuk sebagian besar pengguna InnoDB
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 transaksi yang aman. INNODB memiliki kemampuan komit, kembalikan, dan pemulihan crash. INNODB mendukung integritas referensi kunci asing.
Termasuk perubahan MySQL 5.6
MESIN PENYIMPANAN INNODB:
Jadi, tidak ada gunanya menggunakan MyISAM
Engine jika Anda sudah ditingkatkan ke 5.6, jika tidak maka jangan menunggu untuk upgrade ke MySQL 5.6.
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 sedikit penulisan, atau tidak sama sekali. Alasan MyISAM memungkinkan untuk membaca cepat adalah struktur indeksnya: setiap entri menunjuk ke catatan dalam file data, dan penunjuk diimbangi dari awal file. Dengan cara ini catatan dapat dengan cepat dibaca, terutama ketika formatnya TETAP. Dengan demikian, baris memiliki panjang konstan. Area tipikal di mana seseorang 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 yang 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. Untuk mendefrag baris dan mengklaim ruang kosong, fileOPTIMIZE TABLE
perintah harus dijalankan. Karena mekanisme yang sederhana ini, biasanya statistik indeks MyISAM cukup akurat. Kelemahan utama MyISAM lainnya adalah tidak adanya dukungan transaksi dan kunci asing.
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.
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.