Apa yang harus ditetapkan innodb_buffer_pool dan mengapa ..?

20

Saya memiliki 170GB InnoDBindeks dan Data.

Saya harus menyesuaikan ukuran innodb_buffer_pool untuk kinerja yang lebih baik. Ukuran tabel Max dari tabel InnoDB (Indeks + data) adalah 28GB.

Jadi apa yang seharusnya menjadi ukuran optimal dari innodb_buffer_pool.

MEMPERBARUI

kita akan memigrasi basis data lokal kita ini ke EC2 sehingga akan mengatur RAM sesuai dengan statistik innodb saat ini. Itu sebabnya saya memerlukan ukuran buffer pool sehingga kita dapat memiliki RAM yang tersedia di sana.

File Per tabel diaktifkan.

Saya menggunakan mesin Linux.

Abdul Manaf
sumber
Berapa RAM yang tersedia pada mesin yang tidak digunakan oleh proses lain? Apakah Anda menggunakan Windows, Linux atau yang lainnya? Versi MySQL apa yang Anda gunakan? Mengapa ukuran tabel dibatasi hingga 28GB?
Craig Efrein
Ukuran meja tidak terbatas .. Saya telah memberikan ukuran meja hingga satu titik waktu. Akan bertambah karena akan ada sisipan di masa depan ..
Abdul Manaf

Jawaban:

25

Tabel terbesar yang Anda miliki merupakan 16,47% (28/170) dari total data. Bahkan jika tabel itu sangat ditulis dan sangat dibaca, tidak semua tabel 28G dimuat dalam buffer pool pada satu saat tertentu. Yang perlu Anda hitung adalah berapa banyak Pool Buffer InnoDB dimuat pada saat tertentu di DB Server saat ini .

Berikut ini adalah cara yang lebih terperinci untuk menentukan innodb_buffer_pool_size untuk DB Server baru mengingat dataset yang saat ini dimuat dalam Pool Buffer Pool InnoDB saat ini dari DB Server.

Jalankan yang berikut di Instance MySQL Anda saat ini (server tempat Anda bermigrasi)

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data';  -- IBPDataPages 
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total'; -- IBPTotalPages
SHOW GLOBAL STATUS LIKE 'Innodb_page_size'; -- IPS

Jalankan formula IBPPctFull = IBPDataPages * 100.0 / IBPTotalPages.

SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPTotalPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total'); -- SELECT @IBPTotalPages;
SET @IBPPctFull = CAST(@IBPDataPages * 100.0 / @IBPTotalPages AS DECIMAL(5,2));
SELECT @IBPPctFull;

Jika IBPPctFull adalah 95% atau lebih, Anda harus mengatur innodb_buffer_pool_size menjadi 75% dari RAM Server DB.

Jika IBPPctFull kurang dari 95%, menjalankan rumus ini: IBPSize = IPS X IBPDataPages / (1024*1024*1024) X 1.05.

SET @IBPSize = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_page_size'); -- SELECT @IBPSize;
SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPSize = concat(ROUND(@IBPSize * @IBPDataPages / (1024*1024*1024) * 1.05, 2), ' GB' );
SELECT @IBPSize;

Angka untuk IBPSize (dalam GB) adalah angka yang lebih cocok dengan dataset kerja Anda yang sebenarnya.

Sekarang, jika IBPSize masih terlalu besar untuk Konfigurasi RAM Amazon EC2 terbesar, gunakan 75% RAM untuk Amazon EC2 DB Server.

RolandoMySQLDBA
sumber
Itu informasi yang sangat bagus .. Satu lagi yang perlu saya ketahui bagaimana MySQL Server memuat data dan indeks dalam buffer pool saya telah melalui dokumentasi dan mendapatkannya menggunakan LRU tetapi bagaimana memuatnya dalam memori seperti jika saya memiliki 2GB untuk buffer pool tetapi ukuran tabel yang diminta dalam query jauh lebih dari itu .. ??
Abdul Manaf
Hanya halaman data dan indeks yang diperlukan untuk memenuhi kueri yang dimuat ke dalam kumpulan buffer, bukan seluruh tabel. Halaman data dan indeks lama diputar berdasarkan algoritma LRU yang terdaftar di dev.mysql.com/doc/refman/5.5/id/innodb-buffer-pool.html
RolandoMySQLDBA
Abdul, kamu harus pergi dengan jawaban Rolando yang menjawab pertanyaanmu lebih baik dari pada jawabanku. Saya akan menulis ulang jawaban saya sendiri hanya karena saya harus lebih jelas.
Craig Efrein
13

Saya memberikan jawaban ini sebagai informasi pelengkap untuk jawaban Rolando di bawah ini.

Sebelum server dalam produksi

Hitung innodb_buffer_pool_size berdasarkan tabel terbesar yang paling sering digunakan oleh MySQL. Untuk mengidentifikasi tabel terbesar berdasarkan ukurannya di database, Anda dapat menggunakan skrip ini:

select table_schema, table_name, round(data_length/1024/1024,2) as size_mb 
from information_schema.tables where table_schema like 'my_database' 
order by size_mb desc;


+--------------+-------------------------+---------+
| table_schema | table_name              | size_mb |
+--------------+-------------------------+---------+
| heavybidder     | user                 |   522.55|
| heavybidder     | bid                  |   121.52|
| heavybidder     | item_for_sale        |    10.52|
| heavybidder     | account_user         |    5.02 |
| heavybidder     | txn_log              |    4.02 |
| heavybidder     | category             |    0.02 |
+--------------+-------------------------+---------+

Sekarang kita tahu tabel mana yang terbesar di basis data kita, kita perlu menentukan yang mana yang paling sering digunakan. Untuk melakukan itu, saya akan menggunakan program profil seperti Jet Profiler (JP) untuk melihat tabel mana yang paling banyak diakses. JP akan menunjukkan kepada Anda tabel mana yang paling sering diakses. Ini screenshot dari bagian itu di JP

masukkan deskripsi gambar di sini

Jadi dengan mengingat hal ini, saya sekarang tahu bahwa tabel pengguna dan tawaran membutuhkan sekitar 640MB ruang disk, mereka sangat sering digunakan menurut JP dan yang berarti bahwa MySQL akan menyimpan indeks dan data mereka dalam buffer pool sebagai Rolando menyebutkan komentarnya di bawah ini.

Untuk memastikan MySQL memiliki cukup memori untuk menyimpan data untuk tabel terbesar dan paling sering saya gunakan, saya kemudian akan mendefinisikan innodb_buffer_pool_size pada 640MB.

Ada beberapa pertimbangan tambahan, tetapi mereka tidak berlaku untuk innodb_buffer_pool_size.

Apakah ini sistem 32bit atau 64bit? Dalam sistem 32Bit, Anda dibatasi hingga 4GB kecuali Anda mengaktifkan PAE. Di Windows, ini berarti menjalankan edisi Windows Enterprise atau Datacenter.

Berapa banyak memori yang diperlukan oleh proses lain yang berjalan pada sistem Anda? Pada server MySQL khusus, saya akan meninggalkan antara 5% dan 10% untuk OS. Di Windows Anda dapat menggunakan Process Explorer untuk menganalisis penggunaan memori. Di Linux, Anda memiliki sysstat, gratis, htop, atas dan vmstat.

Apakah database hanya terdiri dari tabel Innodb atau gabungan dari Innodb dan MyISAM? Jika ini adalah campuran keduanya, maka saya akan menyisihkan memori untuk key_cache, bergabung dengan variabel, cache permintaan, dll. Anda kemudian dapat menghitung rasio hit MyISAM Anda setelah server diproduksi.

Setelah server dalam produksi

Berapa rasio hit saat ini untuk Innodb?

1 - (innodb_buffer_pool_reads / innodb_buffer_pool_read_requests).

Apa itu Rasio Hit Tembolok Kunci

1 - (Key_reads / Key_read_requests)

Saya biasanya mencoba untuk mendapatkan rasio sedekat mungkin dengan 100%.

Seberapa baik tabel Anda masuk dalam buffer pool

Anda juga dapat melihat seberapa baik data tabel Anda cocok di buffer_pool Anda dengan merujuk ke tautan ini, yang menyediakan cara untuk menunjukkan "berapa banyak halaman dalam buffer pool untuk tabel yang diberikan (cnt), berapa banyak dari mereka yang kotor (kotor) , dan berapa persentase indeks yang sesuai dengan memori (fit_pct). " Berlaku hanya untuk server Percona

http://www.mysqlperformanceblog.com/2010/12/09/how-well-does-your-table-fits-in-innodb-buffer-pool/

Craig Efrein
sumber