Saya menemukan apa cara terbaik untuk memperkirakan ukuran tabel untuk itu saya telah mempelajari banyak blog dan forum tetapi tidak dapat menemukan jawaban yang akurat
Sebagai contoh kita memiliki tabel City dengan mesin InnoDB , katakanlah di masa depan (dalam 1 tahun mendatang) itu akan memiliki 1 juta catatan sehingga apa yang akan menjadi ukuran data yang diperkirakan dan ukuran indeks dari tabel itu dalam periode ini.
mysql> desc City;
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| Name | char(35) | NO | | | |
| CountryCode | char(3) | NO | MUL | | |
| District | char(20) | NO | | | |
| Population | int(11) | NO | | 0 | |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.03 sec)
MEMPERBARUI
Apa yang akan menjadi batas atas yang diestimasi (ukuran tabel maksimum) dengan 1 juta catatan dan bagaimana kita dapat memperkirakannya.
Jawaban:
Diberikan deskripsi tabel, saya melihat
Untuk satu juta baris, itu akan menjadi 77.000.000 byte (73,43 MB)
Adapun untuk mengukur tabel, untuk tabel yang diberikan mydb.mytable, Anda dapat menjalankan kueri ini
Untuk mengukur semua tabel yang dikelompokkan berdasarkan Database dan Storage Engine
Jalankan pertanyaan ini dan Anda dapat melacak perubahan dalam penggunaan disk database / mesin.
Cobalah !!!
sumber
CHAR
panjang perlu dikalikan dengan 3 jika Anda memilikiCHARSET utf8
. Seluruh overhead dapat diperkirakan dengan menggandakan atau melipattigakan perhitungan.ALTER TABLE ... ENGINE=InnoDB;
) untuk mendapatkan rasio yang akurat. Upaya mungkin tidak sepadan.Jika Anda menggunakan tabel InnoDB, Anda bisa mendapatkan ukuran untuk data / indeks individual dari
mysql.innodb_index_stats
. Stat 'size' berisi jawabannya, di halaman, jadi Anda harus mengalikannya dengan ukuran halaman, yaitu 16K secara default .PRIMER indeks adalah data itu sendiri.
sumber
dengan mengeksekusi kueri ini Anda bisa mendapatkan ukuran yang digunakan untuk
Data
danIndex
dari sebuah tabel, Anda dapat memeriksa ukuran ini terhadap # baris dan memperkirakan 1 juta barissumber
Jika Anda belum memiliki data, berikut adalah beberapa kiat. Berikut ini berlaku untuk InnoDB. (MyISAM jauh lebih sederhana, dan lebih kecil.)
Jangan gunakan
CHAR
untuk kolom panjang variabel. ApaCHARACTER SET
yang kamu gunakan Ascii membutuhkan satu byte per karakter; utf8mb4 membutuhkan antara 1 dan 4.Total = sekitar 80 byte.
Lipat gandakan 80 dengan antara 2 dan 3 untuk memperhitungkan berbagai biaya overhead. Kemungkinan besar tabel baris 1M akan berada di antara 160MB dan 240MB.
Untuk mengukur indeks tunggal, misalnya
CountryCode
3 byte:Catatan:
Hanya node daun (dari BTrees) yang perlu dihitung; overhead untuk node non-daun biasanya 1%.
Itu
PRIMARY KEY
"berkerumun" dengan data, sehingga tidak perlu untuk menghitungnya.Jika Anda tidak memiliki PK eksplisit, maka Anda perlu menambahkan 6 byte ke ukuran baris untuk memungkinkan PK buatan.
ROW_FORMAT = COMPRESSED
memberi Anda penyusutan 2: 1. (Ini tidak sebagus tingkat kompresi zip (dll) khas 3: 1.)SHOW TABLE STATUS LIKE "tablename";
adalah cara cepat untuk menghitung ukuran 'aktual'. LihatData_length
untuk data dan PK;Index_length
untuk indeks sekunder, danData_free
untuk beberapa hal lainnya.Jarang
Index_length
melebihiData_length
. Namun itu tidak "salah" untuk itu terjadi.sumber
Itu membosankan. Tetapi detailnya ada di dokumen .
Agar seakurat mungkin, yang jarang diperlukan, Anda harus membaca tentang struktur tabel dan struktur indeks juga.
Jika saya berada di posisi Anda, saya akan membuat tabel, mengisinya dengan sejuta baris data uji, dan mengukur perubahan ukuran. Bergantung pada aplikasi Anda, Anda mungkin perlu mempertimbangkan ukuran file log transaksi.
sumber