Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Gabbro
    Registrato dal
    Nov 2000
    Messaggi
    828

    ristrutturare tabella per invio ricezione messaggi

    Salve,
    ho molti problemi su una mia tabella e sono arrivato al punto di pensare di doverla ristutturare.

    La tabella viene usata dagli utenti del mio sito che la sfruttano per mandarsi messaggi tra di loro.
    Per mia fortuna il sito è visitatissimo però ora che siamo arrivati ad un milione di messaggi il db non ce la fà più e va molto lento quando i tantissimi utenti sono connessi.

    La tabella è così strutturata:


    CREATE TABLE messaggeria (
    id int(10) unsigned NOT NULL auto_increment,
    data datetime default NULL,
    ricevente varchar(15) NOT NULL default '',
    id_ricevente int(7) unsigned NOT NULL default '0',
    mittente varchar(15) NOT NULL default '',
    id_mittente int(7) unsigned NOT NULL default '0',
    titolo varchar(50) default NULL,
    testo text,
    fl_letto_mittente int(1) unsigned NOT NULL default '0',
    fl_letto_ricevente int(1) unsigned NOT NULL default '0',
    PRIMARY KEY (id),
    KEY id_recipient (id_ricevente),
    KEY id_sender (id_mittente),
    KEY fl_letto_mittente (fl_letto_mittente),
    KEY date (date),
    KEY idx_utente_ricev (id_recipient,fl_letto_ricevente)
    )

    le select che rallentano tutto sono queste:

    (dove l'utente controlla i propri messaggi)

    SELECT id, mittente, titolo, data, fl_letto_mittente,fl_letto_ricevente from messaggi where id_ricevente = 13623 and fl_letto_ricevente <>2 ORDER BY id DESC limit 0, 10

    da notare che anche con questo tipo di query
    SELECT id, mittente, titolo, data, fl_letto_mittente,fl_letto_ricevente
    from messaggi where id_ricevente = 13623 and fl_letto_ricevente in (0,1)
    ORDER BY id DESC limit 0, 10

    il risultato non migliora. fl_letto_ricevente assume i valori 0 se da leggere, 1 se letto e 2 se cancellato.



    Ho pensato a delle soluzioni come ad esempio dividere questa tabella in n tabelle da 100.000 records ognuna in modo da velocizzare il tutto ma non mi piace molto come soluzione. Potete aiutarmi?

  2. #2
    Utente di HTML.it L'avatar di Gabbro
    Registrato dal
    Nov 2000
    Messaggi
    828
    stavo vedendo che posso utilizzare una tabella merge ma ho paura che sia cmq lento. avete mai provato?

  3. #3
    Utente di HTML.it L'avatar di Gabbro
    Registrato dal
    Nov 2000
    Messaggi
    828
    up

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    460
    Non ho guardato molto bene la tabella MA la prima idea che mi viene in mente e' di dividere in due la tabella: in una tieni i messaggi piu' vecchi di 1, 2, 3 mesi a tua scelta (questi messaggi vengono consultati rarissimamente). In un'altra tieni i messaggi sufficientemente recenti.

    Piu' tardi do' un occhio approfondito anche allo schema, ma in ogni caso mi sembra che a naso tu abbia un po' troppi indici.
    There are 10 types of people in the world - those who understand binary and those who don't.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    460
    Ok, ho trovato un primo errore piuttosto grave:

    fl_letto_ricevente <>2

    Questa causa lettura sequenziale. Gli incici sono utili solo per paragoni di tipo =, non <>

    Anziche' mettere fl_letto_ricevente <> 2 metti fl_letto_ricevente==1 or .. ==0 e ci mettera' molto meno
    There are 10 types of people in the world - those who understand binary and those who don't.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    460
    Idem per questa:

    and fl_letto_ricevente in (0,1)
    There are 10 types of people in the world - those who understand binary and those who don't.

  7. #7
    Utente di HTML.it L'avatar di Gabbro
    Registrato dal
    Nov 2000
    Messaggi
    828
    Originariamente inviato da frinkia
    Idem per questa:

    and fl_letto_ricevente in (0,1)
    quindi (fl_letto_ricevente =0 or fl_letto_ricevente =1)
    dovrebbe essere + veloce di fl_letto_ricevente in (0,1)
    e fl_letto_ricevente <> 2
    ?
    chiedo perchè io ho provato a modificare in questi altri 2 modi la query ma non ho avuto vantaggi sostanziali, forse perchè in quel momento c'era un carico eccessivo sul server non sò.

  8. #8
    Utente di HTML.it L'avatar di Gabbro
    Registrato dal
    Nov 2000
    Messaggi
    828
    avete qualche altra idea?

  9. #9
    Utente di HTML.it L'avatar di Gabbro
    Registrato dal
    Nov 2000
    Messaggi
    828
    up

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 © 2025 vBulletin Solutions, Inc. All rights reserved.