Domanda

Sto cercando di ottimizzare un database redmine prima che faccia troppo di un dolore; le modifiche (in pratica un registro di tutte le modifiche SVN) è a 137000 righe (ish) e la tavola è impostato per le impostazioni di default b ASIC. Nessun imballaggio chiave ecc.

La tabella è la seguente

ID int[11] Auto Inc (PK)
changeset_id int[11]
action varchar[1]
path varchar[255]
from_path varchar[255]
from_revision varchar[255]
revision varchar[255]
branch  varchar[255]

Indici: primaria (ID),
changeset_id impostato INDICE BTREE

Tutti su charset latin1 sulla base di un po 'di informazioni da http://forge.mysql.com/ wiki / Top10SQLPerformanceTips

Il motore di Table è InnoDB Confezione chiavi è impostato sul valore predefinito (confezioni solo char varchar)

Tutte le altre opzioni sono disattivate.

Che cosa è il modo migliore per ottimizzare questo? (Bar Tronca; o))

È stato utile?

Soluzione

Ci sono alcune tecniche di ottimizzazione generali per mysql: la prima sarebbe assicurarsi che le tipi di dati si inseriscono l'ABC (vedere qui ). Andando oltre quindi dall'alto verso il basso, ID e changeset_id guardare bene, l'azione dovrebbe probabilmente essere un char 1 invece di un varchar (nullable se si può lasciare vuoto (e, in generale, assicurarsi che l'annullabile è impostato correttamente su altri campi)). Per quanto riguarda gli altri 5 campi (che a seconda della dimensione probabilmente dominare la tabella), sono stringhe il tipo di dati corretto? (Sto cercando di indovinare di sì con il percorso, from_path, ramo, ma forse revisione dovrebbe essere un numero (sto cercando di indovinare che non è così che supporta git o qualcosa))

Inoltre, sembrano obiettivi di normalizzazione, soprattutto dal momento che un "percorsi" e "revisioni" tabella sarebbe normalizzare quattro di loro ( qui è un tutorial di base , se ne avete bisogno)

Altri suggerimenti

Dipende interamente sui vostri leggere e scrivere caratteristiche, vale a dire, le query che stai facendo, e quanto spesso si sta scrivendo ad esso.

Il modo per ottimizzare per la scrittura è quello di ridurre al minimo il numero di indici. Idealmente, si utilizza quello che in server MS SQL sarebbe il "indice cluster" con una chiave monotonically incremento, assicurando che si scrive nuovi record alla fine della tabella, e si scrive nessun altro indice separato. Meglio ancora, anche, è quello di saltare i DBMS e scrivere in un semplice file di log vecchia di qualche tipo, se non hai bisogno di alcuna capacità transazionale.

Per le query, bene, che si può ottenere così complesso come ti piace. Non tenere a mente, però, che se avete bisogno di qualsiasi quantità significativa di dati dalla tabella per una query (vale a dire, si tratta di più di un semplice guardare un singolo record basato su una chiave), le scansioni di tabella potrebbero non essere una cosa negativa. In generale, se si sta esaminando più di 3-5% dei contenuti di un tavolo, una scansione di tabella sarà molto veloce. Ancora una volta, per questo, un file vecchio pianura sarà probabilmente più veloce di un DBMS.

Se è necessario ottimizzare per entrambi, prendere in considerazione l'ottimizzazione per la scrittura, e poi fare una copia su base regolare che di ottimizzare per le query, e facendo le query contro la copia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top