Le connessioni di rete MySQL sono lente


0

Ho installato 3 macchine collegate a un router (tramite WI-FI). Ho un server MySQL installato su una macchina Core I7 con una buona quantità di memoria. e sto interrogando da altre macchine per estrarre i dati dal server.

Su una tabella con oltre 100000 voci, la query viene eseguita in 0,4 secondi sul server, tuttavia la stessa query richiede quasi 3 secondi per essere eseguita sul computer client.

Cosa mi sto perdendo? Perché l'esecuzione della stessa query (selezionare * da tableName) richiede così tanto tempo, quando eseguita da una macchina client.

Grazie per i commenti ho testato la stessa query su entrambe le macchine, impostando il limite su 10 righe. Il tempo impiegato è inferiore a 0,01 MS. Quindi, per un set di dati più breve il tempo è in linea, tuttavia quando vengono interrogate tabelle complete, c'è una differenza significativa nel tempo.

La mia velocità teorica di rete è di 150 MBps, ma le query impiegano molto tempo. Qualche suggerimento su come migliorare? Avere un interruttore e collegare tutte le macchine per passare? risolverà il problema?

Non ci sono altri processi in esecuzione sul server e sul client. ho chiuso tutte le applicazioni e sto cercando di eseguire il debug del problema con Slowness. Grazie in anticipo.


Quanto è grande il set di dati risultante dalla tua query? Se è enorme, allora potrebbe essere solo il tempo di trasferimento al computer remoto. Se si utilizza una query più limitata (ovvero: SELECT * FROM tableName LIMIT 5;o SELECT <SpecificField> FROM tableName) è più veloce?
Ƭᴇcʜιᴇ007,

Grazie per i tuoi input. Le tue osservazioni sono state accurate. Quando eseguo la query con Limit impostato su 10 su entrambe le macchine, il tempo è molto simile. Tuttavia, c'è una grande differenza quando eseguo una query sulla tabella completa.
kris123456,

Hai provato a fare come ho suggerito nella mia risposta di seguito? (creare uno sproc?) Ci sarà sempre una differenza, tuttavia, potrebbe essere dovuta a più cause. Inoltre, come stai interrogando i dati sul PC remoto (programma installato, codice eseguito attraverso un IDE, ecc.)
George 2.0 Hope

Questo test è stato eseguito utilizzando HeidiSQL. Ho un'applicazione personalizzata (Java e DBUtils) che estrae ed elabora i dati da queste tabelle. Ci sono ~ 500 tabelle.
kris123456,

Le prestazioni dell'applicazione sono peggiori di quelle riportate sopra. Sono in fase di ottimizzazione e risoluzione di questi problemi.
kris123456,

Risposte:


0

select * from tableNameè una query molto vaga (ottenere TUTTI i dati dalla tabella). Se la tabella è lunga oltre 100000 righe, è probabile che il server stia restituendo molti dati. Se la dimensione totale dei dati restituiti è grande, il trasferimento su un computer remoto richiederà molto più tempo rispetto al semplice scaricamento sul server locale.

Prova ad aumentare la precisione delle tue query in modo che restituiscano meno dati. Ad esempio, se hai solo bisogno di "Nome" e "Indirizzo" dalla tabella, prova qualcosa del genere in Select Name,Address from tableNamemodo da non ottenere anche un sacco di campi / dati che non utilizzerai.

L'unico (unico) altro modo per accelerarlo in modo significativo è aumentare la velocità della connessione di rete tra il server e i client.


Sì. Provato. Come per la domanda, aggiungendo un limite a 10 record nella query ha migliorato drasticamente le prestazioni, tuttavia nell'applicazione, avrei bisogno di tutti i dati per l'elaborazione. Quindi, cercando un modo per improvvisare la velocità.
kris123456,

La velocità teorica della rete è superiore a 40 MB ps. La dimensione della tabella è di 25 MB. La latenza del ping è <2ms. Tuttavia, 4 secondi sono enormi per un tavolo.
kris123456,

Temo che le prestazioni sarebbero peggiori in caso di richieste di aggiornamento.
kris123456,

0

Ciò che potrebbe mancare è come stai interrogando il DB ... per esempio, è il client sconosciuto che "estrae" tutti i dati dal server [e forse blocca la tabella come fa] e quindi visualizza i risultati -vs- il server fornendo solo i dati necessari [e non bloccando la tabella o bloccando solo la richiesta interna al server].

Per quanto riguarda sia il blocco che la quantità di dati "estratti" ... dipende da come si esegue la query ... per quanto riguarda il blocco, dipende dalle impostazioni predefinite; perché in alcuni casi anche una query selezionata può aver bisogno di bloccare le tabelle per garantire un'aggregazione valida su query a esecuzione prolungata ... Inoltre, quando si parla di JOIN, si "unisce" nella memoria client locale o sul server? C'è un caso aziendale per entrambi. Di solito, in casi come il tuo (in cui sono operati grandi quantità di dati) è il caso ideale per SPROC e UDF (funzioni definite dall'utente). Hai provato a creare SPROC e UDF? (solo passando un risultato e / o uno stato).

Quello che proverei a fare è eseguire una procedura memorizzata (che internamente ha lo stesso SQL esatto dello "SQL" manuale del client) dal PC remoto e vedere se hai ancora un tale ritardo.

Se ciò non risolve il problema, devi davvero includere dettagli più specifici non solo sulla query, ma su quale "stack" stai usando per interrogarlo sul PC remoto.


È solo una selezione * dalla query tablename. credo che questo non blocchi la tabella, perché non ci sono clausole di aggiornamento in essa contenute.
kris123456,

Risposta aggiornata, prova alcuni SPROC e UDF ... nel tuo caso d'uso, dovrebbe risolvere i tuoi problemi.
George 2.0 Hope,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.