Contatta l'assistenza

Rispondiamo per e-mail, di solito entro due giorni.

Per prevenire abusi, Google reCAPTCHA verifica questo invio; alcuni dati vengono trasmessi a Google. Lo script viene caricato solo quando apri questo modulo.

← Tutti gli articoli

Quando aggiungere un indice rallenta

La tabella delle cifre giornaliere ha una chiave: contatore e data insieme. Cinque punti del codice le pongono un'altra domanda — non «questo contatore nel tempo», ma «tutti i contatori in questi giorni». La galleria in prima pagina, la classifica, la mappa del sito, un grafico su 90 giorni e le cifre di stato. Senza un indice sulla colonna della data, ognuna di esse legge tutte le 114.113 righe.

Quell'indice rende la galleria dieci volte più veloce. Non è stato aggiunto. Ecco la misura che lo ha deciso.

galleria, un giorno — da 61,5 a 6,1 ms classifica, 30 giorni — da 88,6 a 89,2 ms mappa del sito, 14 giorni — da 79,6 a 94,8 ms grafico 90 giorni — da 120,0 a 109,2 ms cifre di stato, 365 giorni — da 204,9 a 225,1 ms barra in alto senza indice, in basso con indice in tutto: 555 ms diventano 524 ms

Un'interrogazione è diventata molto più veloce

La galleria chiede i contatori che oggi hanno avuto visite. Senza indice sulla data percorre l'intera tabella; con l'indice cerca una sola data e legge 443 righe. Da 61,5 millisecondi si è passati a 6,1. Non è un risultato sottile, e se fosse stata l'unica cosa misurata l'indice sarebbe già nel database.

Due interrogazioni sono diventate più lente

La mappa del sito chiede quattordici giorni ed è rallentata del 19 %. Le cifre di stato chiedono un anno e sono rallentate del 10 %. In entrambi i casi il pianificatore è passato dalla chiave primaria al nuovo indice e ha scelto peggio.

Questa è la parte che vale la pena capire, perché non è un difetto del pianificatore. Leggere un intervallo attraverso un indice secondario significa trovare le righe corrispondenti nell'indice e poi prelevare ciascuna dalla tabella. Per una fetta stretta è un affare. Per quattordici giorni su tredici mesi sono ancora tante righe prese una alla volta, e una scorsa diretta della tabella — letta in ordine fisico, che è ciò che piace a dischi e cache — la batte. Il pianificatore non lo sa. Vede un intervallo e un indice, e lo prende.

Non si può dire «usa questo indice solo per la galleria». Un indice è a disposizione di ogni interrogazione che tocca quella colonna, e il pianificatore lo userà ovunque le sue stime glielo suggeriscano. Aggiungerne uno è una modifica a ogni interrogazione su quella tabella, non a quella che si aveva in mente.

In tutto: niente

Su tutte e cinque, 555 millisecondi sono diventati 524. Un miglioramento di 1,1×, che su un Raspberry Pi il quale serve queste pagine comunque da una cache non vale una modifica dello schema.

Il grafico su 90 giorni sembra migliorato del 9 %. Non viene contato, e vale la pena dire perché. Ogni interrogazione è stata misurata tre volte: senza indice, con indice, poi di nuovo senza. Se la seconda passata senza indice non finisce vicino alla prima, la differenza era la macchina e non la modifica. Per il grafico su 90 giorni le due passate senza indice differivano del 13,8 % — più dell'effetto che si vorrebbe dichiarare. Quella riga quindi non misura nulla, e come nulla viene riportata.

Come è stato misurato, e perché conta

Non sulla tabella in funzione. Lo script ne fa una copia, lavora sulla copia e alla fine la elimina. Aggiungere un indice a una tabella di produzione per vedere che succede è una cosa che si può fare una volta per sorpresa.

Le interrogazioni sono quelle vere, prese dal codice, giunzione con la tabella dei contatori compresa. Una versione precedente di questa prova usava un sostituto semplificato e dava una risposta molto più entusiasmante: venti volte più veloce. Quell'interrogazione semplificata non la esegue nessuno.

Che numero sarebbe uscito

Se si fosse misurato nel modo consueto — prendere l'interrogazione che sembra lenta e cronometrarla prima e dopo — la risposta sarebbe stata «dieci volte più veloce, si procede». L'indice sarebbe entrato, la galleria avrebbe accelerato, la mappa del sito e la pagina di stato sarebbero rallentate, e nessuno avrebbe collegato le due cose, perché nessuno le stava guardando.

Questa è la forma generale della faccenda. Una modifica a un'infrastruttura condivisa non si valuta sul caso che l'ha motivata. La domanda non è «questo aiuta la cosa che sto guardando» ma «che altro tocca, e che cosa ne diventa».

C'è una versione che potrebbe funzionare: un indice che porta entrambe le colonne, la data per prima, così che la galleria possa essere servita dal solo indice, senza tornare alla tabella. Forse non tenterebbe nemmeno il pianificatore sugli intervalli larghi. Non è misurato, quindi non è una raccomandazione — è la prossima cosa da mettere sulla copia.

Pubblicità