Perbedaan substansial antara ukuran basis data di bawah MySQL dan ukuran aktual pada disk

8

Ketika saya memeriksa ukuran database saya di bawah MySQL saya mendapatkan ini:

MariaDB [(none)]> SELECT table_schema "Data Base Name",  sum( data_length + index_length ) / 1024 /  1024 "Data Base Size in MB",  sum( data_free )/ 1024 / 1024 "Free Space in MB"  FROM information_schema.TABLES  GROUP BY table_schema;
+--------------------+----------------------+------------------+
| Data Base Name     | Data Base Size in MB | Free Space in MB |
+--------------------+----------------------+------------------+
| alfresco           |         245.75000000 |      34.00000000 |
| drupal             |         892.15625000 |     216.00000000 |
+--------------------+----------------------+------------------+

Ketika saya memeriksa ukuran pada disk saya mendapatkan ini:

$ sudo du -h --max-depth=1 /var/lib/mysql/
317M    /var/lib/mysql/alfresco
1.4G    /var/lib/mysql/drupal

Jika saya menggabungkan ruang bekas dan bebas yang diberikan oleh Maria DB dan membandingkannya dengan angka disk saya memiliki yang berikut ini:

alfresco: DB=279MB  DISK=317MB (+14%)
drupal: DB=1100MB   DISK=1433MB (+30%)

T: Apakah normal memiliki banyak overhead pada disk / Apakah ada yang bisa saya lakukan untuk menguranginya?

FYI Saya pikir menjalankan optimasi mysql akan membantu ( menggunakan perintah itu ), itu memang mengurangi ukuran database, tetapi tidak mengubah ukuran file pada disk.

Informasi tambahan:

server:             ubuntu server 10.04 LTS
DB server:          MariaDB
DB engine:          InnoDB v10 (for all tables)
Table collation:    utf8_general_ci
Nb Drupal tables:   416  (0.80MB overhead per table)
Nb Alfresco tables: 84   (0.45MB overhead per table)
Maks
sumber
Semua tabel InnoDB? Berapa meja?
gbn

Jawaban:

5

Jika Anda menggunakan tabel InnoDB, ukuran file ibdata Anda akan bertambah seiring waktu. Jadi, jika Anda mengeluarkan DELETEpernyataan, ukuran basis data Anda akan berkurang, tetapi file ibdata akan tetap sama (tidak berkurang).

Jika Anda tidak menggunakan innodb_file_per_tableopsi, satu-satunya cara untuk mendapatkan kembali ruang tersebut adalah dengan membuang basis data dan memulihkan dari dumpfile.

Namun, jika Anda menggunakan innodb_file_per_table, Anda dapat mengeluarkan

ALTER TABLE foo ENGINE=InnoDB;

pada tabel yang tumbuh terlalu besar untuk merebut kembali ruang disk.

Derek Downey
sumber
mengapa ukuran file ibdata tidak berkurang jika ukuran database tidak?
Maks
Tampaknya 'keputusan desain' yang dibuat oleh pengembang innodb, dijelaskan secara singkat dalam komentar bug ini . Permintaan fitur serupa dibuat beberapa tahun yang lalu, tetapi tidak ada yang dilakukan tentang hal itu. Saya tidak setuju dengan keputusan desain secara pribadi, tetapi memang demikianlah adanya.
Derek Downey
mengapa tidak mengoptimalkan ruang reklamasi tabel? atau itu hanya "rapi" bukan "menyusut"?
gbn
1
@ gbn "Untuk tabel InnoDB, OPTIMIZE TABLE dipetakan ke ALTER TABLE, yang membangun kembali tabel untuk memperbarui statistik indeks dan ruang kosong yang tidak digunakan dalam indeks cluster." src Jadi ya, hanya rapi. Alasan yang sama AlTER TABLE foo ENGINE=InnoDBtanpanya innodb_file_per_table=1tidak akan menyusut ibdata.
Derek Downey