Informazioni generali

Una chiave degli indici segmentata (Segmented Key Cache) è una collezione di strutture per le normali cache degli indici di MyISAM, chiamate segmenti di cache. Le cache segmentate mitigano uno dei maggiori problemi della cache semplice: la contenzione dei thread causata dai lock sulla cache degli indici (mutex). Con le consuete cache degli indici, ogni chiamata ad una funzione dell'interfaccia della cache deve acquisire un lock. Perciò i thread competono per ottenere questo lock, anche nel caso in cui hanno acquisito dei lock condivisi sul file e le pagine che vogliono leggere si trovano nei buffer della cache degli indici.

Quando si lavora con una cache degli indici segmentata, le funzioni dell'interfaccia della cache che accedono a una certa pagina devono acquisire il lock solo su quei segmenti a cui la pagina è assegnata. Questo diminuisce le probabilità che i thread debbano competere per lo stesso lock.

Tutte le pagine di un file possono essere poste in un buffer composto da un solo segmento. Il numero dei segmenti è dato dal numero di file e dalla posizione della pagina nel file, ed è sempre lo stesso per ogni pagina. Le pagine sono distribuite in maniera uniforme tra i segmenti.

L'idea e il codice originale della cache degli indici segmentata sono di Fredrik Nylander di Stardoll.com. Il codice è stato pesantemente modificato, migliorato e infine unito a MariaDB da Igor Babaev di Monty Program (ora SkySQL).

Alcuni risultati dei benchmark, che comparano le varie configurazioni della key_cache_segments, sono disponibili alla pagina Segmented Key Cache Performance,

Sintassi della cache segmentata

Nuova variabile globale: key_cache_segments. Specifica il numero di segmenti nella cache delle chiavi. I valori ammessi sono i numeri interi tra 0 e 64. Se il numero dei segmenti è impostato a un valore superiore a 64, esso verrà ridotto a 64 e si otterrà un warning.

Un valore "0" indica che la cache degli indici è una cache regolare (cioé non segmentata). Questo è il default. Se key_cache_segments è "1" (o maggiore), allora verrà usato il codice relativo alla segmentazione. In pratica, non esistono ragioni per utilizzare una cache segmentata con un singolo frammento, se non per scopi di test. Per tutti gli altri fini, impostare key_cache_segments = 1 dovrebbe essere più lento rispetto a qualsiasi altra configurazione, e non dovrebbe essere utilizzato in produzione.

Anche le altre variabili globali utilizzate con le normali cache degli indici non segmentate, si applicano anche alla cache segmentata: key_buffer_size, key_cache_age_threshold, key_cache_block_size e key_cache_division_limit. Si veda la pagina Server System Variables per informazioni su queste variabili.

Statistiche sulla cache degli indici segmentata

Le statistiche sulla cache degli indici segmentata si trovano nella tabella KEY_CACHES, nel database INFORMATION_SCHEMA. Le colonne di questa tabella sono:

Nome ColonnaSpiegazione
KEY_CACHE_NAMEIl nome della cache
SEGMENTSTotale dei segmenti (impostato a NULL per le cache regolari)
SEGMENT_NUMBERNumero dei segmenti (impostato a NULL per le cache regolari e per le righe che contengono dati statistici aggregati)
FULL_SIZEMemoria per i buffer e le strutture ausiliarie
BLOCK_SIZEDimensioni dei blocchi
USED_BLOCKSNumero dei blocchi attualmente in uso
UNUSED_BLOCKSNumero dei blocchi attualmente inutilizzati
DIRTY_BLOCKSNumero dei blocchi attualmente sporchi
READ_REQUESTSNumero delle richieste di lettura
READSNumero delle effettive letture dei file nei buffer
WRITE_REQUESTSNumero delle richieste di scrittura
WRITESNumero delle effettive scritture dai buffer ai file

Vedi anche

Commenti

Sto caricando i commenti......