Tampon havuzu, InnoDB'nin verileri ve dizinleri bellekte tuttuğu yerdir. Çalışma kümeniz oraya sığıyorsa sorgular bellekten yanıtlanır. Sığmıyorsa aynı sorgular diski okur — ki bu, aynı iş için yüz ila bin kat daha yavaştır.
Elinizdekine bakın
mysql -e "SELECT @@innodb_buffer_pool_size/1024/1024/1024 AS gb"
Varsayılan değer 128 MB'tır. 8 GB belleği olan bir sunucuda, makinedeki her şey arasında en çok başarımı sahipsiz bırakan ayar budur.
Verinizin gerçekte ne kadar büyük olduğu
SELECT ROUND(SUM(data_length + index_length)/1024/1024/1024, 2) AS gb
FROM information_schema.tables WHERE engine = 'InnoDB';
Sayıyı seçin
- Adanmış veritabanı sunucusu — belleğin yüzde 60 ila 70'i.
- PHP ve web sunucusuyla paylaşımlı — yüzde 25 ila 40, ve takas olup olmadığını izleyin.
- Bundan küçük veri — verinin boyutuna biraz ekleyerek ayarlayın; fazlası ziyandır.
# /etc/mysql/mysql.conf.d/mysqld.cnf
innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 4 # one per GB, up to 8
innodb_log_file_size = 512M
Yeterince büyük olup olmadığını denetleyin
mysql -e "SHOW STATUS LIKE 'Innodb_buffer_pool_read%'"
Diske dokunmak zorunda kalan okumaları toplam okuma isteklerine bölün. Yaklaşık yüzde 1'in altı sağlıklıdır; sürekli daha yüksek olması, havuzun çalışma kümesi için küçük kaldığı anlamına gelir.
Makineyi takasa düşürecek kadar büyük ayarlamayın. Takasa düşmüş bir veritabanı, tampon havuzu küçük bir veritabanından çok daha yavaştır — bkz. Bellek, takas ve takasın ne zaman bir belirti olduğu.
Daha fazla bellek satın almadan önce sorguların aklı başında olduğunu denetleyin. Eksik tek bir dizin, bir çalışma kümesini olduğundan on kat büyük gösterebilir — bkz. Ne zaman dizin eklenmeli.