7.1 Gyorsítótárazás a DB oldalon
A MySQL nagymértékben méretezhető algoritmusokat használ a táblákkal való munka során, így a MySQL még kis mennyiségű memóriával is futhat. Természetesen a jobb teljesítményhez több RAM szükséges.
Az aktuális beállítások megtekintéséhez csatlakozzon az adatbázishoz
#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)
Először győződjön meg arról, hogy a gyorsítótárazás engedélyezve van. Változó:
query_cache_type
BE (1) vagy IGÉNY (2) kell legyenquery_cache_limit
- meghatározza a gyorsítótárba kerülő eredmény maximális méretétquery_cache_size
nullától különbözik. A DEMAND használatakor csak az utasítást tartalmazó kérések kerülnek a gyorsítótárbaSQL_CACHE;
query_cache_min_res_unit
a lefoglalt memóriablokk minimális mérete a gyorsítótárazott lekérdezés eredményeinek tárolására. A MySQL nem tárolja a gyorsítótárat egyetlen nagy memóriarészben, ehelyett minimális méretűquery_cache_min_res_unit
(=alapértelmezés szerint 4 KB) blokkokat foglal le igény szerint. Az utolsó ilyen blokk adatméretre csonkolódik, és a fennmaradó memória felszabadul.
A gyorsítótárazás hatása az, hogy amikor a szerver kérést kap, megnézi, hogy a kérés hash-je a gyorsítótárban van-e. Ha a hash egyezik - a szerver azonnal visszaadja az eredményt - a kérés elemzése, optimalizálása stb. overhead - gyorsítótár-mechanizmus kíséretében - a gyorsítótár böngészése, a lekérdezés eredményének gyorsítótárba írása stb.
És ha sok kis kérés van a gyorsítótárban, akkor ez a memória töredezettségéhez vezethet a nagyszámú szabad blokk miatt. Ez pedig a gyorsítótárazott bejegyzések törlését okozza a memória hiánya miatt. Ebben az esetben érdemes csökkenteni az értékét query_cache_min_res_unit
. Ha a legtöbb lekérdezés nagy eredményeket ad, akkor ennek a beállításnak a növelése javíthatja a teljesítményt.
Próbáljuk meg értékelni a hatást. Megnézzük, hogyan változnak a gyorsítótár találati számlálói (Qcahe_hits), a memóriahiány miatt érvénytelennek nyilvánított kérelmek száma (Qcache_lowmem_prunes), a SELECT típusú kérések teljes száma (és csak ezek kerülnek gyorsítótárba):
#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 A gyorsítótár aktuális állapota
A lekérdezés gyorsítótárának figyelésére a következőket kell használni 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
megmutatja, hogy hány szabad blokk van a gyorsítótárban (a gyorsítótárban tárolt kérések növekedésével csökken);Qcache_total_blocks
— a foglalt blokkok száma;Qcache_free_memory
- megmutatja a szabad "rendelkezésre álló" memóriát a gyorsítótárazáshoz;Qcache_hits
- azon kérések száma, amelyek eredményét a gyorsítótárból vették ki anélkül, hogy ténylegesen hozzáfértek volna az adatbázishoz;Qcache_inserts
- a gyorsítótárhoz hozzáadott kérések száma;Qcache_lowmem_prunes
- a memóriahiány miatt a gyorsítótárból eltávolított kérések száma;Qcache_not_cached
- az időgazdálkodási funkciók stb. használata miatt a gyorsítótárba nem írt kérések száma;Qcache_queries_in_cache
- a gyorsítótárban lévő kérések száma.
Megtekintheti a SELECT lekérdezések teljes számát:
mysql> show status like 'Com_select';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select | 16719 |
+---------------+-------+
1 row in set (0.00 sec)
7.3 Gyorsítótárazási hatékonyság
„A gyorsítótár hatékonyságát a változó értékének elosztásával ajánlott értékelni Qcache_hits on Qcache_hits + Com_select
, mivel egy kérés feldolgozásakor a Qcache_hits számláló növekszik (ha a kérés feldolgozása a gyorsítótárból történik), vagy a Com_select (ha a kérés nincs gyorsítótárban). Ezt a módszert a "Mysql Performance Optimization" O'reilly javasolja
Van egy másik mód az interneten
qcache_hit_ratio = qcache_hits / (qcache_hits + qcache_inserts + qcache_not_cached)
Ha ez az érték > 0,8, akkor a kérések 80%-a gyorsítótárban van, ami nagyon jó mutató.
Ha %
a gyorsítótár találata alacsony, akkor növelnie kell az értéket query_cache_size
.
Az aktuális érték a következőképpen nézhető meg:
SHOW VARIABLES LIKE 'query_cache_size';
Ismét felmerül a kérdés: hogyan válasszunk megfelelő értéketquery_cache_size?
Ez segíteni fog Qcache_lowmem_prunes
. Ez a változó tárolja a gyorsítótárból az új kérések gyorsítótárba helyezésének szükségessége miatt eltávolított kérések számát. Olyan gyorsítótár-méretre kell törekedni, amelynél Qcache_lowmem_prunes
csak kis mértékben nő. Ehhez ajánlatos összehasonlítani az Qcache_lowmem_prunes
óránkénti értékek különbségét és a mysql által ugyanabban az órában kapott kérések számát.
"A gyakorlatban a query_cache_size kiszámításához két képlet egyike használható:
query_cache_size = (number of requests for 10 minutes)*(average response volume on request) * 1,2
vagy
query_cache_size = (number of requests for 10 minutes)*(average response volume on request) * 1,2
query_cache_size = (forgalom 10 perc alatt) * 1,2 "
Ez 10 percig gyorsítótárazza a kéréseket + további 20% memóriát biztosít a gyorsítótár töredezettségéhez és további gyorsítótárazási tartalékot
A kérésre adott válaszok számát és átlagos mennyiségét a Bytes_sent változók segítségével számíthatja ki .
Így query_cache_size
növeltük az értékeket, ami után érdemes figyelni az értékekre Qcache_total_blocks
, Qcache_free_blocks
és Qcache_queries_in_cache
. A MySQL blokkokban tárolja a gyorsítótárat. 1 kéréshez 2 blokk szükséges: az egyik magához a kérés szövegéhez, a második az eredményhez.
Ha a táblázatot az értékből tekintjükQcache%
A gyorsítótár blokkok teljes számaQcache_total_blocks – 28
A 6. kérés most gyorsítótárban van, ami azt jelenti, hogy 6 * 2 = 12 blokk foglalt
Ingyenes blokkok Qcache_free_blocks – 10
. Minél több tétlen Qcache_free_blocks
, annál nagyobb a gyorsítótár "töredezettsége".
Ha a legtöbb lekérdezés kevés eredő adatot tartalmaz, akkor érdemes csökkenteni a minimális gyorsítótár-blokk méretét query_cache_min_res_unit
, amely alapértelmezés szerint 4 KB.
Ha a legtöbb kérés sok adatot ad vissza, akkor érdemes növelni a cache blokk méretét.
A legfontosabb dolog egy minimális érték elérése Qcache_free_blocks
.
Ha a számláló Qcache_not_cached
nagy, megpróbálhatja növelni a változót query_cache_limit
- ez lehetővé teszi a korlát növelését és a "nem illeszkedő" lekérdezések eredményeinek gyorsítótárazását.
A következő konfigurációs változók felelősek a lekérdezési gyorsítótár használatáért:
query_cache_size
— a lekérdezési gyorsítótár mérete.query_cache_size = 0
letiltja a gyorsítótár használatát;query_cache_limit
- a gyorsítótárban tárolt maximális minta mérete;query_cache_wlock_invalidate
- meghatározza, hogy az adatok a gyorsítótárból kerülnek-e ki, ha a tábla, amelyhez tartoznak, le van zárva olvasásra. =
A mysql lekérdezések gyorsítótárazásának engedélyezéséhez adja hozzá a következő sorokat a my.cnf fájlhoz ([mysqld] szakasz):
query_cache_size = 268435456
query_cache_type =1
query_cache_limit =1 048576
És indítsa újra a szolgáltatást.
7.4 Ahol nem használják a gyorsítótárat
Nincs gyorsítótárban:
- Kérések tőle
SQL_NO_CACHE
- Előkészített lekérdezések
(Prepared statements);
- Lekérdezések, amelyek a külső lekérdezés allekérdezései;
- Lekérdezések a tárolt eljárásokon és függvényeken belül;
- Függvényeket használó lekérdezések:
BENCHMARK ()
,CONNECTION_ID ()
,CONVERT_TZ ()
,CURDATE ()
,CURRENT_DATE ()
,CURRENT_TIME ()
,CURRENT_TIMESTAMP ()
,CURTIME ()
,DATABASE ()
,ENCRYPT ()
egy érvvel,FOUND_ROWS ()
,GET_LOCK ()
,LAST_INSERT_ID ()
,LOAD_FILE ()
,MASTER_POS_WAIT ()
,NOW ()
,RAND ()
,RELEASE_LOCK ()
,SLEEP ()
,SYSDATE ()
,UNIX_TIMESTAMP ()
érvek nélkül,USER ()
,UUID ();
- Tárolt függvényeket, felhasználói változókat vagy hivatkozási táblákat használó lekérdezések mysql rendszeradatbázisokban vagy INFORMATION_SCHEMA-ban;
- • Kérelmek a következő űrlapokon:
SELECT ... IN SHARE MODE
SELECT ... FOR UPDATE
SELECT ... INTO OUTFILE ...
SELECT ... INTO DUMPFILE ...
SELECT * FROM ... WHERE autoincrement_col IS NULL
- Lekérdezések ideiglenes táblákkal vagy egyáltalán nem használnak táblákat;
- Figyelmeztetéseket generáló kérések (figyelmeztetések);
A gyorsítótár defragmentálható a következő paranccsal:
mysql>flush query cache;
Törlés - parancs:
mysql>flush query cache;
A legfontosabb
Soha ne dolgozzon éles környezetben az alapértelmezett beállításokkal. Ez azt eredményezi, hogy a szerver erőforrásainak nagy része nem kerül felhasználásra. A MySQL megfelelő hangolása többszörösére javíthatja az adatbázis teljesítményét. Ez nemcsak felgyorsítja az alkalmazást, hanem megbirkózik a nagy terhelésekkel is.