Halo semua! Lama gak nulis nih, tangan saya gatel huehehe. Kemungkinan beberapa tulisan kedepan saya akan berbagi ilmu yang saya ketahui Database, monggo mohon jangan dihujat kalo ada salah dikit 🔥
Ketika kamu masuk kesini, saya anggap kamu udah paham apa itu RDBMS ya, jadi engga ada pertanyaan tentang apa itu RDBMS lagi. Nah disini khusus membahas tentang InnoDB dan MyISAM.
Buat yang biasa main MySQL terus coba deh kalian export database kalian jadi file.sql dan kalian lihat isi filenya
Dibaris ke-9 kalian akan melihat tulisan ENGINE=InnoDB. Tapi pernah kepikiran nggak sih sebenernya InnoDB ini apaansih? Kenapa Database ribet-ribet harus pake engine segala? Soalnya Engine yang mungkin umum dikalangan developer adalah ENGINE X aka NGINX hehehe.
Tapi tau nggak sih Engine ini ngaruh loh buat pembuatan database kalian.
Umumnya buat yang biasanya masih pake MySQL buat projekan, pada versi MySQL 5.6 default enginenya sudah menggunakan InnoDB, buat yang masih dibawah 5.6 default enginenya adalah MyISAM. Nah bedanya apa?
Saya kutip dari salah satu jawaban di DBA Stack Exchange
First major difference I see is that InnoDB implements row-level lock while MyISAM can do only a table-level lock. You will find better crash recovery in InnoDB. However, it doesn’t have
FULLTEXT
search indexes until v5.6, as does MyISAM. InnoDB also implements transactions, foreign keys and relationship constraints while MyISAM does not. -Poelinca
Nah dari tulisan bahasa inggris ini kita bisa paham secara garis besarnya.
Inno DB mengimplementasikan penguncian level baris, sedangkan MyISAM melakukan penguncian level table.
Loh loh? maksudnya penguncian apaan? Lemme tell ya guys!
Umumnya, pada saat kalian melakukan SELECT. Akan ada proses penguncian data pada table kalian, fungsinya adalah untuk mendapatkan data sebelum table tersebut diubah atau ditambahkan oleh request lain. Apabila kalian menggunakan MyISAM, udah dipastikan dari pengertiannya aja penguncian level table. Berarti, ketika kalian melakukan proses SELECT, satu table kalian akan dikunci untuk mengembalikan hasil yang diminta.
CONTOH
Sebagai contoh menggunakan engine MyISAM, saya melakukan SELECT 5juta data dari table Barang, ketika saya SELECT dan proses SELECT belum selesai, pada saat proses SELECT saya belum selesai ada permintaan UPDATE yang saya minta pada ID 123. Nah karena proses SELECT saya belum selesai, si proses UPDATE ini harus menunggu hingga SELECT 5juta data saya selesai dikembalikan. Proses ini disebut pipeline, ya kalo suka nyebutnya Queue atau Antrian bisa sih dianalogikan seperti hal tersebut. Nah sekarang bayangkan kalau misalnya ketika anda sedang SELECT lalu ada proses UPDATE datang, ada lagi request INSERT, ada lagi request DELETE. Berapa pipeline yang harus database kalian tanggung? Hal ini dapat menyebabkan database kalian deadlock aka K.O. Inilah mengapa MySQL merubah versi enginenya ke InnoDB pada versi minimal 5.6
Sekarang kita analogikan menggunakan engine InnoDB saya melakukan SELECT 5juta data dari table Barang, ketika saya SELECT dan proses SELECT belum selesai, pada saat proses SELECT saya belum selesai ada permintaan UPDATE yang saya minta pada ID 5000124 (5juta 124). Meskipun proses SELECT saya belum selesai, si proses UPDATE ini dapat dilakukan karena SELECT yang saya lakukan hanya id pertama hingga id 5juta. Seperti yang saya jelaskan diatas, level Locking InnoDB hanyalah locking pada ROW, bukan seluruh table. Sehingga apabila ada proses select dan anda melakukan INSERT, UPDATE, DELETE pada ROW yang tidak sedang di lock maka kamu tidak perlu masuk kepada kasus pipeline.