Sorgu önbelleğini yalnızca devre dışı bırakmalısınız
[mysqld]
query_cache_size = 0
ve sonra MySQL'i yeniden başlatın. Bunu neden önereyim ki ???
Sorgu Önbelleği her zaman InnoDB'ye işaret eder. Değişiklikler diğer işlemler için tekrarlanabilir okumaları etkilemezse, InnoDB'nin MVCC'sinin sorgu önbellekten sorguların sunulmasına izin vermesi iyi olurdu. Ne yazık ki, InnoDB sadece bunu yapmaz. Görünüşe göre, hızlı bir şekilde geçersiz kılınan ve muhtemelen tekrar kullanılmayan çok sayıda sorunuz var.
MySQL 4.0 altındaki InnoDB için, sorgu önbelleği işlemler için devre dışı bırakıldı. MySQL 4.1+ için InnoDB, sorgu önbelleğine tablo başına erişime izin verirken trafik polisi oynatır.
Sorunuzun perspektifinden bakıldığında, sorgu önbelleğini kaldırmanın gerekçesinin fazla değil, InnoDB'nin bunu nasıl yönettiğini söyleyebilirim.
InnoDB'nin sorgu önbelleği ile nasıl etkileşime girdiği hakkında daha fazla bilgi için, lütfen "Yüksek Performanslı MySQL (İkinci Sürüm)" kitabının 213-215. Sayfalarını okuyun. .
Verilerinizin tamamı veya çoğunluğu MyISAM ise, SQL_NO_CACHE kullanma orijinal fikrinizle devam edebilirsiniz.
Bir InnoDB ve MyISAM karışımınız varsa, önbellek özlemlerinizin ne kadar yüksek olduğuna bağlı olarak uygulamanız için doğru dengeyi bulmanız gerekecektir. Aslında, aynı kitabın 209-210. Sayfaları önbellek kayıplarının sebeplerine işaret ediyor:
- Sorgu önbelleklenebilir değildir, çünkü özgün özellikli bir yapı içermez (CURRENT_DATE gibi) veya sonuç kümesi depolanamayacak kadar büyük olduğu için.
- Sunucu sorguyu daha önce hiç görmemiş, bu nedenle sonuçlarını önbelleğe alma şansı hiç olmamıştı.
- Sorgunun sonucu daha önce önbelleğe alındı, ancak sunucu tarafından kaldırıldı. Bu, saklamak için yeterli bellek olmadığı için, birileri sunucuya onu kaldırması için talimat verdiği veya geçersiz olduğu için olabilir.
ve önbelleğe alınamayan çok az sayıda sorgu ile yüksek önbellekleme özlemlerinin temel nedenleri şunlar olabilir:
- Sorgu önbelleği henüz sıcak değil. Bu, sunucunun önbelleği sonuç kümeleriyle doldurma şansının olmadığıdır.
- Sunucu daha önce görmediği sorguları görüyor. Çok fazla tekrarlanan sorunuz yoksa, bu önbellek ısındıktan sonra bile olabilir.
- Çok fazla önbellek geçersizliği var.
GÜNCELLEME 2012-09-06 10:10 EDT
En son güncel bilgilerinize bakarken, query_cache_limit
1048576 (1M) olarak ayarladınız. Bu, 1M olarak ayarlanmış herhangi bir sonucu sınırlar. Daha büyük bir şey alırsanız, önbelleğe alınmaz. Sahipkenquery_cache_size
104857600 (100M) olarak ayarlanmış , bu yalnızca mükemmel bir dünyada ayarlanmış 100 önbelleğe alınmış sonuç için izin verir. Yüzlerce sorgu gerçekleştirirseniz, parçalanma oldukça hızlı bir şekilde gerçekleşecektir. Ayrıca, asgari boyut sonuç seti olarak 4096 (4K) vardır. Ne yazık ki, mysql sorgu önbelleğini birleştirmek için hiçbir iç mekanizmaya sahip değildir.
Sorgu önbelleğine sahip olmanız ve çok fazla RAM'iniz varsa, aşağıdakileri uygulayabilirsiniz:
SET GLOBAL query_cache_size = 0;
SELECT SLEEP(60);
SET GLOBAL query_cache_size = 1024 * 1024 * 1024;
sorgu önbelleğini temizlemek için. Tüm önbelleğe alınmış sonuçları kaybedersiniz, bu nedenle yoğun olmayan saatlerde bu satırları çalıştırın.
Ayrıca aşağıdakileri de tayin ederim:
- query_cache_size = 1G
- query_cache_limit = 8M
Bu 23G RAM bırakır. Aşağıdakileri yükselteceğim:
- innodb_buffer_pool_size = 12G
- key_buffer_size = 4G
Bu 7G bırakır. Bu işletim sistemi ve DB bağlantıları için yeterli olmalıdır.
InnoDB Buffer Pool verileri ve dizinleri önbelleğe alırken, anahtar arabelleğin yalnızca MyISAM dizin sayfalarını önbelleğe aldığını unutmayın.
Bir öneri: MySQL 5.5'e yükseltin, böylece InnoDB'yi birden fazla CPU için ve okuma / yazma G / Ç için birden fazla iş parçacığı için yapılandırabilirsiniz.
InnoDB için birden fazla CPU'ya erişimle bağlantılı olarak MySQL 5.5 kullanımı ile ilgili daha önceki yayınlarıma bakın
GÜNCELLEME 2012-09-06 14:56 EDT
Sorgu önbelleğini temizleme yöntemim oldukça aşırıdır çünkü önbelleğe alınmış verileri hortumlar ve tamamen farklı bir RAM kesimi oluşturur. Yorumunuzda belirttiğiniz gibi FLUSH QUERY CACHE
(önerdiğiniz gibi) hatta RESET QUERY CACHE
daha iyi olurdu. Açıklama için, "iç mekanizma yok" dediğimde, tam olarak öyle demek istedim. Birleştirme gerekli ve manuel olarak yapılması gerekiyor. Crontab'd olması gerekecekti .
InnoDB'de DML'yi (INSERT'ler, UPDATE'ler, DELETE'ler) MyISAM'da olduğundan daha sık yaparsanız, başlangıçta söylediğim tümüyle sorgu önbelleğini kaldır derim.