İnnodb_buffer_pool ne ayarlanır ve neden ..?


20

170 GB'lık InnoDBdizin ve Verilerim var.

Daha iyi performans için innodb_buffer_pool boyutunu yeniden ayarlamalıyım. InnoDB tablosunun (Dizin + veri) maksimum tablo boyutu 28 GB'dir.

Peki, innodb_buffer_pool'un en uygun boyutu ne olmalıdır.

GÜNCELLEME

Biz bu yerel veritabanı ec2 göç edeceğiz böylece RAM mevcut innodb mevcut istatistiklerine göre ayarlayacaktır, bu yüzden ben orada mevcut RAM olabilir bu yüzden tampon havuzu boyutuna ihtiyacım var.

Tablo Başına Dosya etkindir.

Linux makinesi kullanıyorum.


Makinedeki diğer RAM'ler tarafından kullanılmayan kullanılabilir RAM nedir? Windows, Linux veya başka bir şey mi kullanıyorsunuz? Hangi MySQL sürümünü kullanıyorsunuz? Masa boyutu neden 28GB ile sınırlıdır?
Craig Efrein

Limited..I gelecekte ekler olacak şekilde artacaktır time.it biri noktasının kadar tablonun boyutunu verdik değil masa boyutu olduğunu ..
Abdul Manaf

Yanıtlar:


25

Sahip olduğunuz en büyük tablo, toplam verilerin% 16,47'sini (28/170) oluşturmaktadır. Tablo çok yazılmış ve çok okunmuş olsa bile, tablonun 28G'sinin tamamı belirli bir anda tampon havuzuna yüklenmez. Hesaplamanız gereken şey, geçerli DB Sunucusunda herhangi bir anda InnoDB Buffer Pool'un ne kadarının yüklendiğidir .

Geçerli DB Sunucusunun InnoDB Arabellek Havuzunda şu anda yüklü olan veri seti göz önüne alındığında, yeni bir DB Server için innodb_buffer_pool_size değerini belirlemenin daha ayrıntılı bir yolu.

Geçerli MySQL Bulut Sunucunuzda (taşıdığınız sunucu) aşağıdakileri çalıştırın

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

Formülü çalıştırın 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;

IBPPctFull% 95 veya daha yüksekse, innodb_buffer_pool_size değerini DB Server RAM'inin% 75'ine ayarlamanız gerekir.

IBPPctFull% 95'ten daha az ise, bu formüle çalıştırın: 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;

IBPSize (GB cinsinden) sayısı, gerçek çalışma veri kümenize daha çok uyan sayıdır.

Şimdi, IBPSize hala en büyük Amazon EC2 RAM Config için çok büyükse, Amazon EC2 DB Server için RAM'in% 75'ini kullanın.


Bu gerçekten harika bir bilgi .. MySQL Sunucusu nasıl tampon havuzunda veri ve dizinler yükler bilmeniz gereken bir şey daha var ben belgelerine geçti ve LRU kullanır var ama nasıl ben 2GB varsa gibi onları belleğe yükler arabellek havuzu ancak sorgu istenen tablo boyutu çok daha fazla .. ??
Abdul Manaf

Yalnızca sorguyu tatmin etmek için gereken veri ve dizin sayfaları tüm tabloya değil, arabellek havuzuna yüklenir. Eski veriler ve dizin sayfaları listelenen LRU algoritmaya göre dışarı döndürülür dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html
RolandoMySQLDBA

Abdul, sorunuzu benden daha iyi cevaplayan Rolando'nun cevabı ile gitmelisiniz. Sadece daha net olmam gerektiğinden kendi cevabımı yeniden yazacağım.
Craig Efrein

13

Bu cevabı aşağıdaki Rolando'nun cevabına tamamlayıcı bilgi olarak sunuyorum.

Sunucu üretilmeden önce

İnnodb_buffer_pool_size değerini MySQL tarafından en sık kullanılan tablolara göre hesaplayın. En büyük tabloları veritabanındaki boyutlarına göre tanımlamak için bu komut dosyasını kullanabilirsiniz:

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 |
+--------------+-------------------------+---------+

Veritabanımızdaki en büyük tabloların hangileri olduğunu bildiğimize göre, hangilerinin en sık kullanıldığını belirlememiz gerekiyor. Bunu yapmak için, en çok hangi tablolara erişildiğine bakmak için Jet Profiler (JP) gibi bir profil oluşturma programı kullanırdım. JP, hangi tablolara en sık erişildiğini gösterir. İşte JP'deki bu bölümden bir ekran görüntüsü

resim açıklamasını buraya girin

Bunu göz önünde bulundurarak, artık kullanıcı ve teklif tablolarının yaklaşık 640 MB disk alanı aldığını biliyorum, JP'ye göre çok sık kullanılıyorlar ve bu da MySQL'in dizinlerini ve verilerini Rolando olarak tampon havuzunda saklayacağı anlamına geliyor. yorumlarında aşağıda bahsedilmektedir.

MySQL'in en büyük ve en sık kullandığım tablolarım için veri depolamak için yeterli belleğe sahip olduğundan emin olmak için, innodb_buffer_pool_size'yi 640MB'de tanımlarım.

Bazı ek noktalar da vardır, ancak innodb_buffer_pool_size için geçerli değildir.

Bu 32Bit mi yoksa 64 bit mi? 32Bit sistemde, PAE'yi etkinleştirmediğiniz sürece 4 GB ile sınırlandırılırsınız. Windows'da bu, Windows Enterprise veya Datacenter sürümlerini çalıştırmak anlamına gelir.

Sisteminizde çalışan diğer işlemlerin ne kadar belleğe ihtiyacı var? Özel bir MySQL sunucusunda, işletim sistemi için% 5 ile% 10 arasında bırakacağım. Windows'da, bellek kullanımını analiz etmek için İşlem Gezgini'ni kullanabilirsiniz. Linux'ta sysstat, free, htop, top ve vmstat var.

Veritabanı sadece Innodb tablolarından mı yoksa Innodb ve MyISAM'ın bir karışımından mı oluşuyor? Bu ikisinin bir karışımı ise, key_cache, birleştirme değişkenleri, sorgu önbelleği vb. İçin bellek ayırırım. Daha sonra sunucu üretildikten sonra MyISAM isabet oranınızı hesaplayabilirsiniz.

Sunucu üretildikten sonra

Innodb için şu anki isabet oranı nedir?

1 - (innodb_buffer_pool_reads / innodb_buffer_pool_read_requests).

Anahtar Önbellek İsabet Oranı nedir

1 - (Key_reads / Key_read_requests)

Oranı mümkün olduğunca% 100'e yaklaştırmaya çalışırım.

Tablolarınız tampon havuzuna ne kadar iyi uyuyor?

Tablo verilerinin buffer_pool'unuza ne kadar iyi uyduğuna da bakabilirsiniz. ve bellekteki dizin sığdırma yüzdesi nedir (fit_pct). " Yalnızca Percona sunucusu için geçerlidir

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.