Buone tecniche per accelerare l'esecuzione del database

4

Ho un'applicazione ASP.Net che sta usando un database MySQL. Le mie query non vengono eseguite velocemente come vorrei. Ci sono alcuni modi standard per aumentare la velocità di un database MySQL a corto di metterlo su un PC più veloce.

Ad esempio, (non sono sicuro che queste siano vere o no) utilizzando istruzioni preparate su SQL transazionale. Utilizzare le chiavi esterne se applicabile? Cose in questo senso.

EDIT: Il database si trova su una macchina remota

    
posta AngryBird 07.11.2011 - 21:27
fonte

5 risposte

10

Quello che vuoi fare è imparare come profilare le tue query usando il comando MySQL EXPLAIN ( docs doc ). Questo ti dirà come la query sta estraendo i dati dal database, sia che esegua la scansione delle righe una alla volta sia che utilizzi gli indici. Usando questo, puoi spesso velocizzare notevolmente le query. Ovviamente, se non stai utilizzando gli indici, sarebbe il primo punto di partenza ...

L'effetto delle dichiarazioni preparate e non preparate ... in genere è minimo. Ti consigliamo di creare un profilo anche nel codice, ma solo dopo aver ottimizzato gli indici in base a ciò che hai imparato dall'esecuzione di EXPLAIN .

    
risposta data 07.11.2011 - 21:35
fonte
4

L'accelerazione di un database è un argomento importante, inoltre, è necessario dirci se si verificano problemi durante l'interrogazione del database, l'aggiornamento o l'eliminazione dei dati. Tuttavia, ci sono fatti noti che puoi controllare:

0 - Assicurarsi di utilizzare il driver appropriato per connettersi al database e di utilizzare il modo corretto per connettersi (ad esempio, l'uso di ODBC potrebbe essere più lento di un driver nativo). Utilizza i pool di connessione.

1 - Disegna correttamente.

2 - PK e FK sono definiti con lo stesso tipo di dati per velocizzare i join.

3 - Crea indici su PK e FK per tabelle di dimensioni non banali

4 - Scegli il tipo giusto di indici

5 - Ottimizza i tuoi contatti. Evita "SELECT *" e non partecipare ai tavoli a meno che non sia necessario

6 - Qualifica correttamente i tuoi selezioni in modo che il numero di righe di dati restituite sia sufficiente per svolgere la funzione aziendale. Non restituire tutti i dati tutto il tempo, a meno che non sia necessario.

7 - Evita di utilizzare oggetti binari di grandi dimensioni nelle query. Prova a rimuovere le foto dal database all'archivio del file system se possibile.

8 - Utilizza le funzioni di aggregazione e ORDINA VIA saggiamente. Scegli il tuo indice di clustering in modo da poter evitare gli ordinamenti, se possibile.

8a - Evita di usare Non in WHERE e cerca di evitare complesse operazioni di trasformazione.

8b - Assicurati che gli indici siano usati nelle tue query altrimenti accorda le query per utilizzare gli indici o creare gli indici necessari.

9 - Usa una singola colonna per costruire la chiave anziché più colonne quando possibile.

10 - Verifica la struttura fisica di tabelle e indici. Guarda come viene assegnato il tuo spazio

11 - Considerare la ricostruzione dell'indice e la deframmatazione del file system

12 - Controlla le strategie per la messa a punto della ricerca full-text (se la stai usando) - Vedi: FTS

13 - Determina se la tua velocità di rete è sufficiente.

14 - Confrontare il tempo di transazione nell'applicazione ASP.NET rispetto alla stessa query o transazione quando eseguita su una console. La differenza dovrebbe essere vicina. Se trovi una grande variazione, il problema potrebbe riguardare il modo in cui ti connetti, la rete o qualche altro problema.

    
risposta data 08.11.2011 - 08:54
fonte
3

Il database è l'unico posto dove puoi accelerare il tuo programma. Senza ulteriori informazioni sul tuo caso d'uso, è possibile utilizzare una topologia di una cache write-behind?

Una cache write-behind ti permetterà di inserire elementi in una cache per essere scritti su un database in un secondo momento. Per le voci del database che non hanno ulteriori dipendenze (come la lettura dal database entro un determinato periodo di tempo), ciò sarebbe ideale poiché una volta che un elemento è nella cache, sarà nel database per quanto riguarda l'applicazione.

Questa è l'ehcache su come implementare un write- dietro la cache e ho anche collegato a un video decente che illustra come una cache write-behind può rimuovere un collo di bottiglia del database da un'applicazione. link

    
risposta data 07.11.2011 - 22:00
fonte
1

Alcune cose che potrebbero generalmente accadere qui:

  1. Le query sono lente. Esegui la query direttamente sull'istanza MySql. Host veloce? Se sono necessari alcuni secondi, è necessario sintonizzare la query con indici aggiuntivi, ecc.
  2. Troppi dati arrivano attraverso la rete. La query potrebbe essere eseguita istantaneamente, ma la quantità di dati in arrivo sul cavo è eccessiva. Restituire meno dati o reindirizzare i dati al cliente sarebbe un suggerimento / i.
  3. Il server è molto occupato. Che aspetto hanno la CPU e la memoria sul server? È vicino al 100%?

Le istruzioni preparate non fanno molta differenza finché il server non ha un volume elevato di query. La velocità saggia preparata rispetto a quella non preparata sono quasi la stessa cosa, ma con istruzioni preparate il server non deve lavorare tanto, quindi può usare più risorse per fare altre cose.

    
risposta data 07.11.2011 - 23:06
fonte
1

La prima cosa da considerare è se l'indicizzazione è corretta. Le tue query sono condivisibili (cioè possono usare l'indice se esiste)? I tuoi campi chiave stranieri sono indicizzati?

Quindi stai facendo le cose in un modo basato su set o eseguendo il looping di record che è spesso più lento in un database.

Stai usando tecniche conosciute di uccisione delle prestazioni (nel server SQL questo includerebbe l'uso di sottoquery, cursori, UDF scalari, funzioni in join ecc., non sicuro di quali siano gli assassini conosciuti in MySQL ma ci sono libri disponibili I ' Sono sicuro sull'argomento.

Utilizzi select * e restituisci più dati del necessario soprattutto nei join in cui vengono ripetuti almeno i campi dei join.

    
risposta data 07.11.2011 - 23:15
fonte

Leggi altre domande sui tag