Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 17 su 17
  1. #11
    mm, guarda, continua a sembrarmi strano

    per intenderci, lavoro anche su query con 10 join (left e non) e non ho mai superato il paio di mb di memoria consumata

    potresti postare un pò di codice per vedere cosa ci fai con la query?

    (se ti va ovviamente ^^)
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  2. #12
    Originariamente inviato da daniele_dll
    mm, guarda, continua a sembrarmi strano
    Si e' molto strano. Pensavo a due possibilita':

    1) richiama la funzione in un ciclo e quindi esegue nn volte la query
    2) ottiene un risultato cartesiano per mancanza di criteri di selezione appropriati nelle join

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #13
    ecco la mega query

    Codice PHP:
    $tqq ='SELECT s.*, p.*, FROM_UNIXTIME(p.data_apertura,\'%H:%i del %d.%m.%Y\') AS data_apertura_comoda, '
    .' o.userid AS userid_tuo, o.stai_giocando_ora AS giochi_partita, '
    .' o1.userid AS N_userid, o1.username AS N_username, o1.email AS N_email, o1.ultima_data AS N_ultima_data, '
    .' o2.userid AS S_userid, o2.username AS S_username, o2.email AS S_email, o2.ultima_data AS S_ultima_data, '
    .' o3.userid AS E_userid, o3.username AS E_username, o3.email AS E_email, o3.ultima_data AS E_ultima_data, '
    .' o4.userid AS O_userid, o4.username AS O_username, o4.email AS O_email, o4.ultima_data AS O_ultima_data, '
    .' NOW() AS data_timestamp '

    .' FROM (p_partita_dati p, p_stanze s, online AS o) '

    .' LEFT JOIN online AS o1 ON (o1.userid=p.gNord) '
    .' LEFT JOIN online AS o2 ON (o2.userid=p.gSud) '
    .' LEFT JOIN online AS o3 ON (o3.userid=p.gEst) '
    .' LEFT JOIN online AS o4 ON (o4.userid=p.gOvest) '

    .' WHERE '
    .' p.stanza_assegnata=\''.$roomid.'\' AND s.id = p.stanza_assegnata AND p.tavolo_da_pulire!=\'P\' AND o.userid=\''.$userid.'\''
    e questa è la struttura delle table

    codice:
    CREATE TABLE IF NOT EXISTS `online` (
      `session_id` varchar(90) NOT NULL default '',
      `userid` int(11) NOT NULL default '0',
      `sesso` enum('0','1') NOT NULL default '1',
      `supporter` enum('Y','N') NOT NULL default 'N',
      `username` varchar(18) NOT NULL default '',
      `email` varchar(100) NOT NULL default '',
      `data_entrata` int(11) NOT NULL default '0',
      `ultima_data` int(11) NOT NULL default '0',
      `lato` enum('nord','sud','est','ovest') NOT NULL default 'nord',
      PRIMARY KEY  (`session_id`),
      KEY `userid` (`userid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    -- --------------------------------------------------------
    
    --
    -- Struttura della tabella `p_partita_dati`
    --
    
    CREATE TABLE IF NOT EXISTS `p_partita_dati` (
      `idpartita` int(11) unsigned NOT NULL auto_increment COMMENT 'diventa pure il n. della stanza della chat!',
      `tavolo_assegnato` int(11) NOT NULL default '0' COMMENT 'generato random tra 1mln e 1mld',
      `stanza_assegnata` tinyint(4) NOT NULL default '0',
      `nome_assegnato` varchar(60) NOT NULL default ' - -',
      `stato_partita` enum('in_attesa','in_preparazione','in_corso','terminata_interrotta','terminata_da_pulire','terminata_da_eliminare','terminata_correttamente','terminata_abbandonata') NOT NULL default 'in_attesa',
      `in_classifica` enum('Y','N') NOT NULL default 'N',
      `posti_assegnati` enum('0','1') NOT NULL default '0',
      `data_apertura` int(11) NOT NULL default '0',
      `data_inizio_partita` int(11) NOT NULL default '0',
      `data_fine_partita` int(11) NOT NULL default '0',
      `userid` int(11) NOT NULL default '0',
      `codice` varchar(12) NOT NULL default '',
      `tot_giocatori` enum('2','4') NOT NULL default '2',
      `NS_punti` smallint(6) NOT NULL default '0',
      `NS_vp` tinyint(4) NOT NULL default '0',
      `EO_punti` smallint(6) NOT NULL default '0',
      `EO_vp` tinyint(4) NOT NULL default '0',
      `gNORD` int(11) NOT NULL default '0',
      `gSUD` int(11) NOT NULL default '0',
      `gEST` int(11) NOT NULL default '0',
      `gOVEST` int(11) NOT NULL default '0',
      `lato_serve` enum('nord','sud','est','ovest') NOT NULL default 'nord',
      `lato_riceve` enum('nord','sud','est','ovest') NOT NULL default 'nord',
      `inverti_giocatori` enum('nord-sud','est-ovest','fatto','non-serve') NOT NULL default 'nord-sud',
      `gNORD_accesso` int(11) NOT NULL default '0',
      `gSUD_accesso` int(11) NOT NULL default '0',
      `gEST_accesso` int(11) NOT NULL default '0',
      `gOVEST_accesso` int(11) NOT NULL default '0',
      `ultimo_turno` enum('nord','sud','est','ovest') NOT NULL default 'nord',
      PRIMARY KEY  (`idpartita`),
      KEY `stanza_assegnata` (`stanza_assegnata`),
      KEY `tavolo_assegnato` (`tavolo_assegnato`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='le partite da aprire' AUTO_INCREMENT=376 ;
    
    -- --------------------------------------------------------
    
    --
    -- Struttura della tabella `p_stanze`
    --
    
    CREATE TABLE IF NOT EXISTS `p_stanze` (
      `id` tinyint(4) NOT NULL auto_increment,
      `nome_stanza` varchar(15) NOT NULL default '',
      `stato` enum('aperta','chiusa') NOT NULL default 'aperta',
      `tavoli_occupati` tinyint(4) NOT NULL default '0',
      `tavoli_in_attesa` tinyint(4) NOT NULL default '0',
      PRIMARY KEY  (`id`),
      UNIQUE KEY `lettera` (`nome_stanza`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
    Una forte determinazione ad esser felici vi aiuterà

  4. #14
    ehm ... c'è un pò di confusione in questa query

    in pratica estrai, senza collegare, le tabelle p_partita_dati, p_stanze e online (o per meglio dire colleghi solo le prime due) e poi joini alla p_partita_dati 4 volte la stessa tabella online

    cosa dovrebbe fare, esattamente, la query ... credo che si potrebbe seriamente ottimizzare

    considera che se una query richiede 128mb ad esempio deve essere una query che lanci una volta ogni tanto, non certo una che lanci a ripetizione
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  5. #15
    ok, la query era pensata per fare esattamente come dici tu.
    cioè prendere dei dati da un parte (p_partita_dati e p_stanza) visto che è una sola riga, e poi si, 4 volte sulla stessa ma perchè ho sempre id diversi (che potrebbero anche esser zero quindi vado di left join).

    si consuma parecchio (circa 130 mb) se la tupla tira fuori più di 50 righe.
    siccome penso di lanciarla molto spesso, vedo di limitarla a 10/12.


    o forse devo spezzare su più query?
    Una forte determinazione ad esser felici vi aiuterà

  6. #16
    mmm, mi sembra veramente strano che questa query possa consumare 128mb di memoria o oltre estraendo solo 50 righe ... o non ti estrae 50 righe e ti fa casino perché mysql ti moltiplica le righe combinandole per via del fatto che non tutte sono collegate correttamente oppure c'è qualche altro problema nel codice

    hai la possibilità di mandarmi un dump del database? (anche che mi mandi il link via pvt) che provo a sistemare la query stamani in qualche intermezzo lavorativo
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  7. #17
    Originariamente inviato da daniele_dll
    mmm, mi sembra veramente strano che questa query possa consumare 128mb di memoria o oltre estraendo solo 50 righe ... o non ti estrae 50 righe e ti fa casino perché mysql ti moltiplica le righe combinandole per via del fatto che non tutte sono collegate correttamente oppure c'è qualche altro problema nel codice
    ho dato un'occhiata veloce e mi pare che gia' la query con l'uso indifferenziato delle apici abbia difficile vita.

    Poi direi che per una chiave primaria mettere quel `session_id` varchar(90) sia poco efficiente e vada contro a diversi principi della chiave primaria perfetta. la tabella online nella inner join non ha riferimento con altre tabelle e quindi rende un prodotto cartesiano.

    Sicuramente e' un progetto da rivedere sia come database e sopratutto come query. Necessita conoscere oltre al dump anche il progetto.

    Auguri.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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.