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

MySQL/InnoDB dan kueri yang sudah berjalan lama

Pertama, saya pikir akan berguna sebagai latar belakang untuk membaca kontrol konkurensi multi-versi (MVCC) sebagai latar belakang jawaban ini.

InnoDB mengimplementasikan MVCC, yang berarti dapat menggunakan pembacaan non-locking untuk SELECT biasa . Ini tidak memerlukan pembuatan "snapshot" dan sebenarnya InnoDB tidak memiliki konsep snapshot yang sebenarnya sebagai objek. Sebagai gantinya, setiap record dalam database melacak nomor versinya sendiri dan mempertahankan "roll pointer" ke record "undo log" (yang mungkin masih ada atau tidak) yang mengubah baris ke versi sebelumnya. Jika versi rekaman yang lebih lama diperlukan, versi saat ini dibaca dan penunjuk gulungan tersebut diikuti dan membatalkan rekaman yang diterapkan hingga versi rekaman yang cukup lama diproduksi.

Biasanya sistem secara konstan membersihkan undo log tersebut dan menggunakan kembali ruang yang digunakan.

Kapan saja transaksi yang berjalan lama (perhatikan, tidak harus satu kueri) ada, log undo harus disimpan (tidak dibersihkan) untuk membuat ulang versi yang cukup lama dari semua catatan untuk memenuhi transaksi itu. Dalam sistem yang sangat sibuk, log yang dibatalkan itu dapat terakumulasi dengan sangat cepat untuk menghabiskan ruang gigabyte. Selain itu, jika catatan individu tertentu sangat sering dimodifikasi, mengembalikan catatan tersebut ke versi yang cukup lama untuk memenuhi kueri dapat memerlukan banyak aplikasi undo log (ribuan).

Itulah yang membuat "kueri yang sudah berjalan lama" mahal dan disukai. Mereka akan meningkatkan konsumsi ruang disk untuk menyimpan log undo di tablespace sistem, dan mereka akan berkinerja buruk karena aplikasi undo log record untuk mengembalikan versi baris setelah dibaca.

Beberapa database menerapkan jumlah maksimum ruang log undo yang dapat dikonsumsi, dan begitu mereka mencapai batas itu, mereka mulai membuang catatan log undo yang lebih lama dan membatalkan transaksi yang sedang berjalan. Ini menghasilkan pesan kesalahan "snapshot terlalu lama" kepada pengguna. InnoDB tidak memiliki batasan seperti itu, dan memungkinkan akumulasi tanpa batas.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Temukan jumlah kolom dalam sebuah tabel

  2. Solusi penskalaan untuk MySQL (Replikasi, Pengelompokan)

  3. Di meja kerja MySQL apa nama pengguna/kata sandi untuk koneksi?

  4. Bagaimana cara menempatkan baris di atas dalam kueri mysql.

  5. Baca satu kolom dari satu baris dari database MySQL