Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22

Discussione: Multiprocessore

  1. #1

    Multiprocessore

    Salve a tutti
    ho un pc i7 con 8 core e, dovendo eseguire un join su tabelle da 2,5 milioni di tuple, avrei necessariamente bisogno di spingere al massimo le prestazioni utilizzando tutti e i core.
    Attualmente ne usa uno solo, infatti l'utilizzo della cpu è al 15% (1/8).
    Qualcuno sa come configurare mysql per sfruttare gli 8 core?
    grazie mille

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469

    Re: Multiprocessore

    Originariamente inviato da alfonso534791
    Salve a tutti
    ho un pc i7 con 8 core e, dovendo eseguire un join su tabelle da 2,5 milioni di tuple, avrei necessariamente bisogno di spingere al massimo le prestazioni utilizzando tutti e i core.
    Attualmente ne usa uno solo, infatti l'utilizzo della cpu è al 15% (1/8).
    Qualcuno sa come configurare mysql per sfruttare gli 8 core?
    grazie mille
    è proprio semplice: non si fa

    mysql scala malissimo (orizzontalmente), scala meglio verticalmente.

    Per banalizzare due core da 3Ghz sono meglio di 8 da 2,4Ghz.
    ---
    La versione 5.5, e la 5.6 in più, cerca di rimuovere questi limiti attraverso una caterva di patch (c.d. "google patch"), ma ancora non è un granchè.
    ---
    Riassumendo: non ce la farai. Puoi aumentare la concorrenza usando, invece di mysql, mariadb, che contiene le patch percona xtra, ma in misura marginale.

    Per avere una "vera" scalabilità ti tocca usare più istanze mysql/mariadb, cosa che potrebbe essere utile o inutile a seconda del db che utilizzi, considerato anche che l'engine federated è stato espunto da mysql (rimane invece in mariadb)
    ---
    Poi c'è da chiarire che il join c'entra ben poco col processore, quindi un netto miglioramento l'avrai... non con più CPU, bensì con più RAM, una struttura db fatta bene, un piano query adatto che elimini tutti i vari filesort e tabelle tmp.

    Puoi fare anche meglio usando sistemi di memorizzazione SSD-SLC, o anche tachion, o addirittura (dipende da quanto puoi spendere)... coi meravigliosi RAM disk (non è difficile avere una macchina con 64GB di RAM, tipicamente sufficienti per appoggiare lì i database).
    ---
    Gli approcci come vedi son tanti, inizia a dettagliare il problema e magari qualche consiglio utile può saltar fuori

  3. #3
    Bheee!!! ogni mia speranza è andata!
    non devo acquistare hardware, ma devo arrangiarmi con quello che ho e sono vincolato a mysql! Quindi eliminerei tutte le opzioni tranne quella delle patch e quella della ram nel senso di aumentare la memoria dedicata a mysql (se è possibile)! Il mio PC ha 6Gb di ram e ne vedo usati solo 2.5! La query la devo fare una sola volta, poi, ottenuta la tabella, il problema si sposta altrove su altri software (e non credo che questo sia il thread giusto). Le tabelle sono una da 2.5 Milioni di tuple e una da 800Mila. E' un left join su 800Mila, cioè la tabella finale sarà da 800Mila.
    Nella peggiore delle ipotesi aspetto!!
    P.S. sono già due giorni che aspetto

    Grazie mille per la risp

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da alfonso534791
    Bheee!!! ogni mia speranza è andata!
    non devo acquistare hardware, ma devo arrangiarmi con quello che ho e sono vincolato a mysql! Quindi eliminerei tutte le opzioni tranne quella delle patch e quella della ram nel senso di aumentare la memoria dedicata a mysql (se è possibile)! Il mio PC ha 6Gb di ram e ne vedo usati solo 2.5! La query la devo fare una sola volta, poi, ottenuta la tabella, il problema si sposta altrove su altri software (e non credo che questo sia il thread giusto). Le tabelle sono una da 2.5 Milioni di tuple e una da 800Mila. E' un left join su 800Mila, cioè la tabella finale sarà da 800Mila.
    Nella peggiore delle ipotesi aspetto!!
    P.S. sono già due giorni che aspetto

    Grazie mille per la risp
    devi fare l'explain della query.
    sono tabelle piccole, non vedo particolari problemi ad eseguirle

  5. #5
    explain select * from tab1 as a left join tab2 as b on (a.Id=b.Id1 or a.Id=b.Id2);

    +----+-------------+-------+------+---------------+------+---------+------+---------+-------+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    +----+-------------+-------+------+---------------+------+---------+------+-----
    ----+-------+
    | 1 | SIMPLE | a | ALL | NULL | NULL | NULL | NULL | 870909 | |
    | 1 | SIMPLE | b | ALL | NULL | NULL | NULL | NULL | 2554105 | |
    +----+-------------+-------+------+---------------+------+---------+------+-----
    ----+-------+

    mi dice simple quando invece è chiaramente un join!!
    cosa posso ottimizzare?

  6. #6
    Originariamente inviato da alfonso534791
    Nella peggiore delle ipotesi aspetto!!
    P.S. sono già due giorni che aspetto
    che aspetti cosa?

  7. #7
    che termini la query!!!
    io nel frattempo l'avevo mandata!
    solo che ora l'ho fermata, ho creato indici sulle due tabelle e l'explain mi ha detto che ne avrebbe usato solo uno (vabbe) e l'ho reinviata sperando che si sbrighi!!
    Posso fare altre ottimizzazioni?

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da alfonso534791
    che termini la query!!!
    io nel frattempo l'avevo mandata!
    solo che ora l'ho fermata, ho creato indici sulle due tabelle e l'explain mi ha detto che ne avrebbe usato solo uno (vabbe) e l'ho reinviata sperando che si sbrighi!!
    Posso fare altre ottimizzazioni?
    certo che puoi.

    Ovviamente gli indici sui campi usati nei join sono indispensabili (ammesso che abbiano una selettività rilevante).

    poi spiega questo
    (a.Id=b.Id1 or a.Id=b.Id2);

    perchè pare proprio che siano due query, ovvero il risultato è dato dall'unione
    di
    select blabla where a.id=b.id1
    UNION
    select blabla where a.id=b.id2

    In questo caso ti conviene (divide-et-impera) segmentare la query.
    ---
    Se vuoi le versione "serie" metti DESCRIBE delle tabelle
    (meglio ancora un mysqldump -d)

  9. #9
    select distinct elenco_campi from
    (
    select elenco_campi from tab1 as a left join tab2 as b on a.Id=b.Id1
    UNION
    select elenco_campi from tab1 as a left join tab2 as b on a.Id=b.Id2
    )


    poi facce sape'

  10. #10
    Scusate il ritardo con cui risp
    cmq ho risolto!!!
    ho installato sql server, ho creato un ponte ODBC con mysql in modo da importare le tabelle con tutti gli attributi e i tipi in sql server. Dopodiché ho effettuato la query con sql server che l'ha eseguito in manco 5 min!!!
    grazie mille a tutti per l'aiuto!

    P.S. per quanto riguarda la or, è dovuta al fatto che i due campi Id1 e Id2 hanno sempre valori differenti (ne servono due per distinguere i due indici) mentre nell'altra tabella non c'è bisogno di fare tale distinzione quindi è stato messo un solo attributo Id. Nel fare il join deve coincidere con l'uno o con l'altro.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.