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

Mengapa InnoDB memberikan informasi ruang kosong yang jelas palsu?

(Ini menjawab beberapa pertanyaan yang terkubur di Komentar.)

Salah Nama Ruang "bebas" hanya mencakup seluruh blok, bukan ruang kosong di dalam blok, dan banyak detail lainnya.

Kasus 1:Semua tabel ada di ibdata1 -- SHOW TABLE STATUS (atau kueri yang setara ke dalam information_schema akan menampilkan Data_free yang sama value, yaitu berapa yang gratis di ibdata1 . Ruang ini dapat digunakan kembali oleh meja apa pun. Sulit untuk mengembalikan ruang ke OS.

Kasus 2:Semua tabel adalah file_per_table -- Sekarang setiap Data_free mengacu pada ruang untuk tabel. Dan SUM() bermakna. (ibdata1 masih ada, tetapi tidak berisi tabel nyata; ada banyak hal lain yang dibutuhkan InnoDB.)

Kasus 3:Campuran -- Jika Anda mengaktifkan/menonaktifkan file_per_table pada waktu yang berbeda, beberapa tabel akan berada di ibdata1, beberapa akan memiliki tablespace sendiri.

Kasus 4:BUAT TABLESPACE di 5.7 -- Misalnya, Anda dapat memiliki tablespace untuk setiap database.

Kasus 5:Tabel yang dipartisi -- Setiap partisi bertindak seperti tabel.

Kasus 6:8.0 -- Lebih banyak lagi perubahan yang akan datang.

Database ==Direktori Di pohon direktori MySQL, setiap database dapat dilihat sebagai direktori sistem file. Di dalam direktori tersebut dapat dilihat beberapa kumpulan file untuk setiap tabel. .frm file berisi definisi tabel. Jika .ibd file ada, tabel dibuat dengan file_per_table. Ini mungkin cara yang paling dapat diandalkan untuk mengetahui apakah tabel tersebut file_per_table. (8.0 akan memiliki perubahan signifikan di sini.)

Berapa banyak ruang yang dapat saya gunakan kembali ? Tidak ada jawaban yang bagus. Biasanya memasukkan baris akan menemukan ruang di blok tempatnya berada, dan Data_free tidak akan menyusut. Tetapi, jika ada pemisahan blok, Data_free dapat turun beberapa kali lipat dari 16KB (ukuran blok) atau 4MB ("ukuran luas" - atau mungkin 8MB?). Selain itu, penyisipan acak menyebabkan blok BTree menjadi, rata-rata, sekitar 69% penuh.

Mengubah innodb_file_per_table tidak berpengaruh sampai CREATE TABLE berikutnya atau ALTER TABLE . Dan kemudian itu hanya berpengaruh pada tempat untuk meletakkan data+indeks yang baru dibuat/disalin (ibdata1 atau .ibd). Itu tidak akan merusak data.

Meja besar biasanya memiliki 4MB hingga 7MB Data_free. Saat menghitung berapa banyak baris yang dapat Anda tambahkan, jangan rencanakan Data_free turun di bawah rentang tersebut.

Ukuran_baris_rata-rata harus berguna. Tapi terkadang itu (dan Baris) kurang didekati. Produk mereka (Data_length) selalu benar. Jadi, ini mungkin menjadi perkiraan yang baik dari "baris yang harus dilalui sebelum mengambil lebih banyak ruang dari OS:

(Data_free - 7M) / Avg_row_size

Rekomendasi Tablespace :Letakkan tabel 'besar' di file_per_table. Letakkan tabel 'kecil' di ibdata1 atau tablespace khusus database (5.7). Maaf, tidak ada rekomendasi sederhana tentang garis pemisah antara 'besar' dan 'kecil'. Dan kikuk untuk memigrasi tabel:SET global innodb_file_per_table = ...;; keluar; login (untuk mengambil global); ALTER TABLE tbl ENGINE=InnoDB; . Dan itu harus merupakan salinan lengkap dari tabel.

(Peringatan :Saya telah meninggalkan banyak detail.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. bergabung bersyarat di mysql

  2. Menambahkan jam, menit, detik ke Tanggal SQL

  3. Memasukkan nilai kotak centang ke dalam database

  4. Enkripsi Laravel AES-256 &MySQL

  5. menghitung catatan bergabung dengan tabel pertanyaan dan jawaban