7.1 Veritabanı tarafında önbelleğe alma

MySQL, tablolarla çalışırken yüksek düzeyde ölçeklenebilir algoritmalar kullanır, böylece MySQL az miktarda bellekle bile çalışabilir. Doğal olarak, daha iyi performans için daha fazla RAM'e ihtiyacınız var.

Geçerli ayarları görüntülemek için veritabanına bağlanın


#mysq -u root -p

mysql> show variables like 'query_cache%';
+------------------------------+-----------+
| Variable_name                | Value     |
+------------------------------+-----------+
| query_cache_limit            | 1048576   |
| query_cache_min_res_unit     | 4096      |
| query_cache_size             | 134217728 |
| query_cache_type             | ON        |
| query_cache_wlock_invalidate | OFF       |
+------------------------------+-----------+
5 rows in set (0.00 sec)

İlk olarak, önbelleğe almanın etkinleştirildiğinden emin olun. Değişken:

  • query_cache_typeAÇIK (1) veya TALEP (2) olmalıdır
  • query_cache_limit- önbelleğe alınacak sonucun maksimum boyutunu belirler
  • query_cache_sizesıfırdan farklı olsun TALEP kullanılırken, yalnızca yönergeyi içeren istekler önbelleğe alınırSQL_CACHE;
  • query_cache_min_res_unitönbelleğe alınan sorgunun sonuçlarını depolamak için ayrılan bellek bloğunun minimum boyutu. MySQL, önbelleği büyük bir bellek parçasında depolamaz, bunun yerine query_cache_min_res_unittalep üzerine minimum boyutta (= 4KB varsayılan olarak) bloklar tahsis eder. Bu türden son blok, veri boyutuna göre kısaltılır ve kalan bellek boşaltılır.

Önbelleğe almanın etkisi, sunucu bir istek aldığında, isteğin karmasının önbellekte olup olmadığına bakmasıdır. Karma eşleşirse - sunucu, isteği ayrıştırmadan, optimize etmeden vb. hemen sonucu döndürür. ek yük - bir önbelleğe alma mekanizması eşliğinde - önbelleğe göz atma, sorgu sonucunu önbelleğe yazma vb.

Önbellekte çok sayıda küçük isteğiniz varsa, bu, çok sayıda boş blok nedeniyle belleğin parçalanmasına yol açabilir. Bu da önbelleğe alınan girdilerin yetersiz bellek nedeniyle silinmesine neden olur. Bu durumda değerini düşürmek mantıklıdır query_cache_min_res_unit. Sorgularınızın çoğu büyük sonuçlar veriyorsa, bu ayarı artırmak performansı iyileştirebilir.

Etkiyi değerlendirmeye çalışalım. Önbellek isabet sayaçlarının nasıl değiştiğine (Qcahe_hits), bellek yetersizliği nedeniyle geçersiz ilan edilen isteklerin sayısına (Qcache_lowmem_prunes), SELECT tipi isteklerin toplam sayısına (ve yalnızca bunlar önbelleğe alınır) bakarız:


#mysq -u root -p
mysql> show status like 'Qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 715       |
| Qcache_free_memory      | 130369640 |
| Qcache_hits             | 24209     |
| Qcache_inserts          | 16215     |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 444       |
| Qcache_queries_in_cache | 1740      |
| Qcache_total_blocks     | 4225      |
+-------------------------+-----------+
8 rows in set (0.00 sec)

7.2 Geçerli önbellek durumu

Sorgu önbelleğini izlemek için kullanılır SHOW STATUS:


mysql> SHOW STATUS LIKE 'Qcache_%';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 10       |
| Qcache_free_memory      | 16755496 |
| Qcache_hits             | 49812    |
| Qcache_inserts          | 103999   |
| Qcache_lowmem_prunes    | 0        |
| Qcache_not_cached       | 180      |
| Qcache_queries_in_cache | 6        |
| Qcache_total_blocks     | 28       |
+-------------------------+----------+
8 rows in set (0.00 sec)
  • Qcache_free_blocksönbellekte kaç tane boş blok olduğunu gösterir (önbelleğe alınan istekler arttıkça azalır);
  • Qcache_total_blocks— dolu blokların sayısı;
  • Qcache_free_memory- önbelleğe alma için boş "kullanılabilir" belleği gösterir;
  • Qcache_hits- veritabanına fiilen erişmeden sonuçları önbellekten alınan isteklerin sayısı;
  • Qcache_inserts- önbelleğe eklenen isteklerin sayısı;
  • Qcache_lowmem_prunes- yetersiz bellek nedeniyle önbellekten kaldırılan isteklerin sayısı;
  • Qcache_not_cached- zaman yönetimi vb. işlevlerin kullanımı nedeniyle önbelleğe yazılmayan isteklerin sayısı;
  • Qcache_queries_in_cache- önbellekteki isteklerin sayısı.

SELECT sorgularının toplam sayısını görüntüleyebilirsiniz:


mysql> show status like 'Com_select';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select    | 16719 |
+---------------+-------+
1 row in set (0.00 sec)

7.3 Önbelleğe alma verimliliği

“Önbelleğin etkinliğinin değişkenin değerini bölerek değerlendirilmesi önerilir Qcache_hits on Qcache_hits + Com_select, çünkü bir istek işlenirken Qcache_hits sayacı (istek önbellekten işlenirse) veya Com_select (istek önbelleğe alınmadıysa) artar. Bu yöntem "Mysql Performance Optimization" O'reilly'de önerilmektedir.

İnternette başka bir yol var

qcache_hit_ratio = qcache_hits / (qcache_hits + qcache_inserts + qcache_not_cached)

Bu değer > 0,8 ise isteklerinizin %80'i önbelleğe alınır ki bu çok iyi bir göstergedir.

Önbellek isabeti düşükse %, değeri artırmanız gerekir query_cache_size.

Mevcut değer şu şekilde görüntülenebilir:

SHOW VARIABLES LIKE 'query_cache_size';

Yine şu soru ortaya çıkıyor: yeterli bir değer nasıl seçilir?query_cache_size?

Bu yardımcı olacaktır Qcache_lowmem_prunes. Bu değişken, yeni istekleri önbelleğe alma ihtiyacı nedeniyle önbellekten kaldırılan isteklerin sayısını saklar. Qcache_lowmem_prunesSadece biraz artacağı böyle bir önbellek boyutu için çabalamak gerekir . Qcache_lowmem_prunesBunu yapmak için, saat başına değer farkı ile aynı saatte mysql tarafından alınan istek sayısı arasındaki farkı karşılaştırmanız önerilir .

“Pratikte, query_cache_size hesaplamak için 2 formülden biri kullanılabilir:

query_cache_size = (number of requests for 10 minutes)*(average response volume on request) * 1,2

veya

query_cache_size = (number of requests for 10 minutes)*(average response volume on request) * 1,2
query_cache_size = (10 dakikada trafik hacmi) * 1.2"

Bu, istekleri 10 dakika önbelleğe alır + önbellek parçalanması ve ek önbellek rezervi için ek %20 bellek verir

Sırasıyla Bytes_sent değişkenlerini kullanarak bir isteğe verilen yanıtın sayısını ve ortalama hacmini hesaplayabilirsiniz .

Ve böylece query_cache_sizedeğerleri artırdık, bundan sonra değerlere dikkat etmelisiniz Qcache_total_blocksve Qcache_free_blocks. Qcache_queries_in_cacheMySQL, önbelleği bloklar halinde depolar. 1 istek için 2 bloğa ihtiyaç vardır: biri istek metninin kendisi için, ikincisi sonuç için.

Değerinden tabloyu ele alırsakQcache%

Toplam önbellek bloğu sayısıQcache_total_blocks – 28

İstek 6 şimdi önbelleğe alındı, yani 6 * 2 = 12 blok meşgul

Ücretsiz bloklar Qcache_free_blocks – 10. Ne kadar boşta olursa Qcache_free_blocks, önbelleğin "parçalanma" derecesi o kadar yüksek olur.

query_cache_min_res_unitÇoğu sorguda az miktarda sonuç verisi varsa, varsayılan olarak 4 KB olan minimum önbellek blok boyutunu azaltmaya değer .

Çoğu istek çok fazla veri döndürürse, önbellek bloğunun boyutunu artırmaya değer.

Ana şey, minimum bir değer elde etmektir Qcache_free_blocks.

Sayaç Qcache_not_cachedbüyükse, değişkeni artırmayı deneyebilirsiniz query_cache_limit- bu, sınırı artırmanıza ve "uymayan" sorguların sonuçlarını önbelleğe almanıza olanak tanır.

Aşağıdaki yapılandırma değişkenleri, sorgu önbelleğinin kullanılmasından sorumludur:

  • query_cache_size— sorgu önbelleğinin boyutu. query_cache_size = 0önbellek kullanımını devre dışı bırakır;
  • query_cache_limit- önbellekte saklanan maksimum örneğin boyutu;
  • query_cache_wlock_invalidate- Ait oldukları tablo okuma için kilitliyse verilerin önbellekten alınıp alınmayacağını belirler.
  • =

MySQL sorgu önbelleğini etkinleştirmek için, aşağıdaki satırları my.cnf'ye eklemeniz yeterlidir ( Bölüm [mysqld]):


query_cache_size = 268435456
query_cache_type =1 
query_cache_limit =1 048576

Ve hizmeti yeniden başlatın.

7.4 Önbelleğin kullanılmadığı yerler

Önbelleğe alınmamış:

  • gelen isteklerSQL_NO_CACHE
  • Hazır sorgular(Prepared statements);
  • Dış sorgunun alt sorguları olan sorgular;
  • Saklı yordamlar ve işlevler içindeki sorgular;
  • İşlevleri kullanan sorgular:

    BENCHMARK (), CONNECTION_ID (), CONVERT_TZ (), CURDATE (), CURRENT_DATE (), CURRENT_TIME (), CURRENT_TIMESTAMP (), CURTIME (), DATABASE (), ENCRYPT ()tek argümanlı, FOUND_ROWS (), GET_LOCK (), LAST_INSERT_ID (), LOAD_FILE (), MASTER_POS_WAIT (), NOW (), RAND (), RELEASE_LOCK (), SLEEP (), SYSDATE (), UNIX_TIMESTAMP ()argümansız, USER (),UUID ();

  • MySQL sistem veritabanlarında veya INFORMATION_SCHEMA'da saklanan işlevleri, kullanıcı değişkenlerini veya referans tablolarını kullanan sorgular ;
  • • Aşağıdaki formlardaki talepler:
    • SELECT ... IN SHARE MODE
    • SELECT ... FOR UPDATE
    • SELECT ... INTO OUTFILE ...
    • SELECT ... INTO DUMPFILE ...
    • SELECT * FROM ... WHERE autoincrement_col IS NULL
  • Geçici tablolar içeren veya hiç tablo kullanmayan sorgular;
  • Uyarı üreten istekler (uyarılar);

Önbelleği şu komutla birleştirebilirsiniz:

mysql>flush query cache;

Temizle - komut:

mysql>flush query cache;

En önemli

Üretimde asla varsayılan ayarlarla çalışmayın. Bu, sunucu kaynaklarının çoğunun kullanılmamasına neden olur. Uygun MySQL ayarı, veritabanı performansını birkaç kez artırabilir. Bu sadece uygulamayı hızlandırmakla kalmayacak, aynı zamanda ağır bir yükle de başa çıkacaktır.