Abbiamo un sito di e-commerce di medie dimensioni interamente costruito su misura utilizzando database Java e MySQL sull'infrastruttura AWS. In un periodo di diversi anni, il volume degli ordini è cresciuto notevolmente e quindi la dimensione del nostro database.
Negli ultimi due mesi ci troviamo di fronte a un problema di CRM lento (applicazione di amministrazione), in particolare di segnalazione. Questi rapporti sono costruiti principalmente attorno ai clienti e ai dati degli ordini. Pochi punti da notare sul nostro sistema
- Abbiamo due app Web: storefront & applicazione CRM back-end
- Storefront è in gran parte memorizzato nella cache, quindi l'impatto non è molto visibile lì
- CRM e storefront sono connessi a un singolo server di database con un singolo schema
- Abbiamo aggiunto diversi indici nelle nostre tabelle clienti, ordine e ordine_item per aumentare la velocità delle query utilizzate nei rapporti.
- Queste tre tabelle sono utilizzate principalmente per scopi di reporting. Anche il sito Web continua ad aggiungere nuovi record in queste tabelle quando un nuovo utente registra o posiziona l'ordine.
- AWS RDS utilizzato come server database eseguito in media al 35% della CPU
- Se eseguo queste query direttamente su RDS usando MySql workbench, allora è anche lento.
Voglio capire, come potrei migliorare le prestazioni della nostra applicazione CRM. Qual è l'area chiave in cui devo lavorare su cui avrà un impatto sostanziale.
- È un'infrastruttura? Server database migliore?
- È necessaria l'ottimizzazione delle query?
- È necessaria una migliore indicizzazione nei tavoli?
Modifica - Aggiunta query di esempio
Ad esempio, eseguo la query seguente sulla tabella ordini per recuperare il conteggio degli ordini per una data specifica. Ci vogliono circa 3 secondi in media per restituire i dati. Prevedo che query come questa non dovrebbero richiedere più di un secondo di tempo.
SELECT count(*) as Count FROM orders WHERE date(CONVERT_TZ(CreatedDate,'+00:00','+05:30')) = '2018-07-30'
AND OrderStatusId IN (5,10,15) AND Deleted = 0
Esistono diverse query di questo tipo, che vengono attivate per creare un report. Che alla fine presenta un rapporto all'utente non inferiore a 10-20 secondi
Modifica : ha aggiunto query modificate e il loro tempo di risposta
Come per le risposte, ho testato questa query senza la funzione convert_tz
e una senza convert_tz
e date
. Ma i risultati non sono abbastanza buoni. C'è un guadagno di appena 300 ms se rimuovo entrambe le funzioni convert_tz
e date
. L'ho testato più volte, e ogni volta questa è la differenza tra queste query.
- Query 1 - tempo impiegato = 4,91 secondi
SELECT count(*) as Count FROM orders WHERE date(CreatedDate) = '2018-07-30'
AND OrderStatusId IN (5,10,15) AND Deleted = 0;
- Query 2 - tempo impiegato = 1,72 secondi
SELECT count(*) as Count FROM orders WHERE CreatedDate >= '2018-07-30 00:00:00' AND CreatedDate <= '2018-07-30 23:59:59' AND OrderStatusId IN (5,10,15) AND Deleted = 0;
- Query 3 - tempo impiegato = 2.02 sec
SELECT count(*) as Count FROM orders WHERE date(CONVERT_TZ(CreatedDate,'+00:00','+05:30')) = '2018-07-30' AND OrderStatusId IN (5,10,15) AND Deleted = 0;