Menghapus data dari InnoDB adalah operasi paling mahal yang dapat Anda minta. Seperti yang telah Anda ketahui, kueri itu sendiri bukanlah masalahnya - kebanyakan dari mereka akan tetap dioptimalkan untuk rencana eksekusi yang sama.
Meskipun mungkin sulit untuk memahami mengapa DELETE dari semua kasus adalah yang paling lambat, ada penjelasan yang agak sederhana. InnoDB adalah mesin penyimpanan transaksional. Itu berarti bahwa jika kueri Anda dibatalkan di tengah jalan, semua catatan akan tetap ada seolah-olah tidak ada yang terjadi. Setelah selesai, semua akan hilang dalam sekejap. Selama DELETE, klien lain yang terhubung ke server akan melihat catatan hingga DELETE Anda selesai.
Untuk mencapai ini, InnoDB menggunakan teknik yang disebut MVCC (Kontrol Konkurensi Multi Versi). Apa yang pada dasarnya dilakukan adalah memberikan setiap koneksi tampilan snapshot dari seluruh database seperti ketika pernyataan pertama transaksi dimulai. Untuk mencapai ini, setiap record di InnoDB secara internal dapat memiliki beberapa nilai - satu untuk setiap snapshot. Ini juga mengapa MENGHITUNG di InnoDB membutuhkan waktu - tergantung pada status snapshot yang Anda lihat saat itu.
Untuk transaksi DELETE Anda, setiap record yang diidentifikasi sesuai dengan kondisi query Anda, akan ditandai untuk dihapus. Karena klien lain mungkin mengakses data pada saat yang sama, klien tidak dapat langsung menghapusnya dari tabel, karena mereka harus melihat snapshot masing-masing untuk menjamin atomisitas penghapusan.
Setelah semua catatan telah ditandai untuk dihapus, transaksi berhasil dilakukan. Dan bahkan kemudian mereka tidak dapat segera dihapus dari halaman data yang sebenarnya, sebelum semua transaksi lain yang bekerja dengan nilai snapshot sebelum transaksi DELETE Anda, telah berakhir juga.
Jadi sebenarnya 3 menit Anda tidak terlalu lambat, mengingat fakta bahwa semua catatan harus dimodifikasi untuk mempersiapkannya untuk dihapus dengan cara yang aman untuk transaksi. Mungkin Anda akan "mendengar" hard disk Anda bekerja saat pernyataan berjalan. Ini disebabkan oleh mengakses semua baris. Untuk meningkatkan kinerja, Anda dapat mencoba meningkatkan ukuran kumpulan buffer InnoDB untuk server Anda dan mencoba membatasi akses lain ke database saat Anda MENGHAPUS, dengan demikian juga mengurangi jumlah versi historis yang harus dipertahankan InnoDB per record.Dengan memori tambahan, InnoDB mungkin dapat membaca tabel Anda (kebanyakan) ke dalam memori dan menghindari waktu pencarian disk.