|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2002
Città: udine
Messaggi: 546
|
[mysql] query LENTISSIME! E' normale?
Ciao,
sono niubbo di mysql ma devo assolutamente creare e gestire un database che avrà una decina di tabelle ma milioni di dati; una di queste tabelle, infatti, ha circa 40 colonne ma oltre 40 milioni di righe... Ho terminato di importare i primi 8 milioni (da file di testo) di righe; provo a fare qualche query (da notare che ho creato tre PRIMARY KEY e le query erano ristrette a valori su queste colonne) per testarne la velocità e.... sono LENTISSIME... (devo attendere ore!)Ora mi chiedo, avrò sbagliato qualcosa o è normale? Vi prego, aiuto... sono già molto incacchiato ![]() please!
__________________
a chi non piace il vino... dio neghi anche l'acqua! ![]() DELL Latitude E4300, iPhone 6 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
ammazza...sono parecchi record.
non ti è possibile frammentare quella tabella in più sottotabelle? (poi gestisci da codice quale interrogare) il server è abbastanza performante? hai provato qualche altro db? (postgres, oracle?)
__________________
ho concluso con: kvegeta, doctordb, Leland Gaunt.
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
Considera che, se hai una tabella con, mettiamo, 3 milioni di record e dici al database di tirare su la tabella per fare una query, come impostazione di default essa viene caricata in memoria di solito per intero: ovvio che poi ci stai ore per fare una query. Il problema non è comunque banale.
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Controlla l'uso della memoria e dello swap sul server...se vedi che il server swappa allora monta più memoria...è l'unico modo...
Oppure vale sempre il suggerimento che ti è stato dato: dividi le tabelle... |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2002
Città: udine
Messaggi: 546
|
ammazza, speravo di aver sbagliato qualcosa...
quindi la via unica sembra quella di spezzare in più tabelle. Ora però i problemi diventano i seguenti: 1) essendo che le tabelle le tiro su da file di testo (giuro, mai visti prima file di testo così grandi... 2) come gestisco una ricerca di un dato? Se non è in tab1 allora cerca in tab2 e così via o c'è qualche modo pre creare query ad hoc? PS, grazie hwupgradati...
__________________
a chi non piace il vino... dio neghi anche l'acqua! ![]() DELL Latitude E4300, iPhone 6 |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Hai guardato l'utilizzo della memoria durante la query ?
Che tipo di ricerche devi fare nelle tabelle ? Devi ricercare testo ? Comunque le tabelle le puoi spezzare dopo che hai importato i dati... |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
Più volte ho avuto a che fare con file con milioni di righe (di solito output di simulazione di traffico di rete, files di testo da 500 Mb), ma per fare le analisi non creavo un database apposta (che diventa la soluzione peggiore...).
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: May 2002
Città: udine
Messaggi: 546
|
Quote:
Codice:
SELECT fatturato FROM database.dati WHERE country_initials LIKE 'IT'
__________________
a chi non piace il vino... dio neghi anche l'acqua! ![]() DELL Latitude E4300, iPhone 6 |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: May 2002
Città: udine
Messaggi: 546
|
Quote:
Mi serve proprio un database... I dati li devo poi mettere a disposizione via web. Ecco perché le query DEVONO essere veloci!
__________________
a chi non piace il vino... dio neghi anche l'acqua! ![]() DELL Latitude E4300, iPhone 6 |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Credevo che tu dovessi fare ricerche in campi di testo molto grandi...in quel caso c'è la possibilità di organizzare la ricerca come full text search.
Comunque in tal caso crea un indice sul campo country_initials e guarda come si comporta. Riguardo allo spezzare: http://dev.mysql.com/doc/refman/5.0/...rt-select.html Seleziona righe con caratteristiche precise dalla tabellona e vai ad inserirle in una tabella più piccola. Ultima modifica di cionci : 21-05-2007 alle 10:29. |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Aug 2003
Messaggi: 72
|
Il problema potrebbe pure essere nel modo in cui scrivi la query e quindi fai la ricerca sulla tabella.
Per esempio un grosso problema di performance potrebbe essere dato dalla ricerca con LIKE. Nel caso che hai riportato come esempio conviene probabilmente creare un nuovo campo indicizzato del tipo IT, UK sul quale fare la ricerca diretta dei record che ti interessano.
__________________
Visual Basic e dintorni Blog sullo sviluppo web |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: May 2002
Città: udine
Messaggi: 546
|
Quote:
Per quanto riguarda country_initials, questo è già indicizzato... La tabella è del tipo: ID; country_initials; date; data_a; data_b; ... Io ho indicizzato le prime 3 colonne. Rimane comunque molto lento... soprattutto se penso che dovrò inserire selle condizioni sui dati tipo "WHERE data_a>0 AND data_b<100"
__________________
a chi non piace il vino... dio neghi anche l'acqua! ![]() DELL Latitude E4300, iPhone 6 |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: May 2002
Città: udine
Messaggi: 546
|
Quote:
thx
__________________
a chi non piace il vino... dio neghi anche l'acqua! ![]() DELL Latitude E4300, iPhone 6 |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: May 2002
Città: udine
Messaggi: 546
|
Quote:
__________________
a chi non piace il vino... dio neghi anche l'acqua! ![]() DELL Latitude E4300, iPhone 6 |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
non è che con LIKE usi qualche wildcard?
in questo caso gli indici non verrebbero usati. |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: May 2002
Città: udine
Messaggi: 546
|
no, nessuna wildcard. Tra l'altro, per la cronaca, ho lanciato due query: una con "valore = 'IT'" e l'altra con "valore LIKE 'IT'" e, sorpresa delle sorprese, ci hanno messo lo stesso tempo.
Comunque il problema non stava li... Ho deciso di studiare bene l'architettura del db; dal mega tabellone di 40e6 righe creerò qualche decina di tabelle da usare a seconda dei casi... Unico modo per ottimizzare, credo. Attendo altri consigli.
__________________
a chi non piace il vino... dio neghi anche l'acqua! ![]() DELL Latitude E4300, iPhone 6 |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Probabilmente perché il like senza wildcard viene tradotto con l'uguale...
Guarda anche fra le impostazioni di configurazione di mysql...magari puoi ottimizzare qualcosa anche in quel modo... |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Per curiosità: che tipo di tabelle hai creato ? MyISAM o InnoDB ? E' MySQL 5 ?
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:56.










sono LENTISSIME... (devo attendere ore!)


ho concluso con: kvegeta, doctordb, Leland Gaunt.








