T: Mengapa MySQL tidak memperbarui information_schema secara otomatis, dan bagaimana cara memperbaiki perilaku ini?
J: InnoDB menyimpan nilai auto_increment dalam memori, dan tidak menyimpannya ke disk.
Perilaku kueri metadata (mis. SHOW TABLE STATUS
) dipengaruhi oleh pengaturan innodb_stats_on_metadata
dan innodb_stats_persistent
variabel.
https://dev.mysql.com/doc /refman/8.0/en/innodb-parameters.html#sysvar_innodb_stats_on_metadata
Memaksa ANALYZE setiap kali kami meminta metadata dapat menguras kinerja.
Selain pengaturan variabel tersebut, atau memaksa statistik untuk dikumpulkan dengan menjalankan ANALYZE TABLE
secara manual , saya rasa tidak ada "perbaikan" untuk masalah ini.
(Saya pikir itu sebagian besar karena menurut saya itu bukan masalah yang perlu diperbaiki.)
Untuk mendapatkan nilai tertinggi dari kolom auto_increment dalam sebuah tabel, pola normatifnya adalah:
SELECT MAX(`ai_col`) FROM `myschema`.`mytable`
Yang membingungkan saya adalah mengapa kita perlu mengambil kembali informasi khusus ini. Untuk apa kita akan menggunakannya?
Tentu saja, kita tidak akan menggunakannya dalam kode aplikasi untuk menentukan nilai yang ditetapkan ke baris yang baru saja kita sisipkan. Tidak ada jaminan bahwa nilai tertinggi bukan dari baris yang disisipkan oleh sesi lain. Dan kami memiliki LAST_INSERT_ID()
mekanisme untuk mengambil nilai dari baris yang baru saja dimasukkan sesi kami.
Jika kita menggunakan ANALYZE TABLE
untuk menyegarkan statistik, masih ada sedikit waktu antara itu dan SELECT
berikutnya ... sesi lain bisa tergelincir di INSERT
lain sehingga nilai yang kami dapatkan dari statistik pengumpulan bisa menjadi "kedaluwarsa" pada saat kami mengambilnya.