Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    record massimi su mysql e lentezza

    Ciao a tutti, volevo sapere se esisteva un limite massimo di record per mysql, o se phpMyAdmin gestisce un numero limitato di records perché stò popolando un db che si blocca al record numero 32676 (mi sembra, o giù di li; ora ho cancellato tutto per cui non sono preciso).

    Inoltre volevo sapere se l'istruzione SUM(nome_campo) rallenta le funzionalità del db, perché in questa tabella, peraltro collegata con un INNER JOIN ad un'altra, faccio la somma aritmetica di un campo raggruppando per cliente e il tutto rallenta in maniera incredibile. Sapreste darmi un consiglio per velocizzare l'operazione?

    Vi ringrazio in anticipo.
    Claudio

  2. #2
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    Controlla di aver settato gli indici correttamente.
    think simple think ringo

  3. #3
    Ciao, scusa la mia ignoranza ma non ho capito di che indici parli. Mi potresti spiegare?

  4. #4
    Utente di HTML.it L'avatar di Graboid
    Registrato dal
    Oct 2004
    Messaggi
    619
    Forse dipende dall'int che gestisce la chiave primaria.
    Ad esempio se usi smallint dovresti avere al circa 32000 record massimi.
    Prova a scriverci come sono definiti i campi o postaci la query con cui hai creato la tabella.

  5. #5
    Le tabelle sulle quali avvengono le query sono due: farma_fidelity contiene i dati anagrafici ed è collegata tramite il campo numero con INNER JOIN ad un'altra che si chiama farma_punti che contiene lo storico degli acquisti (quella con più di 32.000 records).
    Vi posto i dump delle due tabelle

    CREATE TABLE `farma_fidelity` (
    `ID_fidelity` smallint(6) NOT NULL auto_increment,
    `numero` int(15) NOT NULL default '0',
    `nome` varchar(155) NOT NULL default '',
    `nascita` varchar(155) NOT NULL default '',
    `indirizzo` varchar(155) NOT NULL default '',
    `cap` varchar(155) NOT NULL default '',
    `localita` varchar(155) NOT NULL default '',
    `provincia` varchar(155) NOT NULL default '',
    `telefono` varchar(155) NOT NULL default '',
    `mobile` varchar(155) default NULL,
    `email` varchar(155) NOT NULL default '',
    `interessi` varchar(255) default 'N;',
    `privacya` char(1) NOT NULL default '',
    `privacyb1` char(1) default NULL,
    `privacyb2` char(1) default NULL,
    `privacyb3` char(1) default NULL,
    `privacyc1` char(1) default NULL,
    `privacyc2` char(1) default NULL,
    `privacyc3` char(1) default NULL,
    `stato` char(1) NOT NULL default '',
    `data` varchar(10) NOT NULL default '',
    `mailsent` char(1) NOT NULL default '',
    PRIMARY KEY (`ID_fidelity`),
    KEY `ID_fidelity` (`ID_fidelity`),
    FULLTEXT KEY `nome` (`nome`)
    ) ;

    --
    -- Dump dei dati per la tabella `farma_fidelity`
    --

    CREATE TABLE `farma_punti` (
    `id_farmapunti` smallint(6) NOT NULL auto_increment,
    `numero_fidelity` varchar(255) NOT NULL default '',
    `data` varchar(10) NOT NULL default '',
    `tipo` varchar(255) NOT NULL default '',
    `punteggio_vendita` varchar(255) NOT NULL default '',
    `cod_prod` varchar(255) NOT NULL default '',
    `descr_prod` varchar(255) NOT NULL default '',
    `quantita` varchar(255) NOT NULL default '',
    `prezzo` varchar(255) NOT NULL default '',
    `punteggio` varchar(255) NOT NULL default '',
    PRIMARY KEY (`id_farmapunti`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1859 ;

    --
    -- Dump dei dati per la tabella `farma_punti`
    --

    questa è la query (c'è anche un'ordinazione per iniziale di parola per cui "WHERE nome like...")
    Codice PHP:
    $query_content "SELECT *, SUM(prezzo) as top FROM (farma_fidelity INNER JOIN farma_punti ON farma_fidelity.numero = farma_punti.numero_fidelity) WHERE nome like '$_GET[i]%%' GROUP BY numero_fidelity ORDER BY prezzo DESC"
    Vi ringrazio per il vostro aiuto.

  6. #6
    Hanno detto due cose giuste:
    ID_fidelity` smallint(6) NOT NULL auto_increment,
    DEVE ESSERE
    ID_fidelity` int(6) NOT NULL UNSIGNED auto_increment,


    E questo è il motivo per cui ti bloccava a 32000 record


    Gli indici li hai, forse anzi ne hai troppi (rallentano in inserimento)
    PRIMARY KEY (`ID_fidelity`),
    KEY `ID_fidelity` (`ID_fidelity`),

    Questo se non erro è un doppione (un indice primario e un indice su una stessa colonna)

  7. #7
    scusa il ritardo di questa risposta, ho provato a modificare le tabelle come mi hai suggerito per cui ora ho le seguenti tabelle

    CREATE TABLE `farma_fidelity` (
    `ID_fidelity` smallint(6) unsigned NOT NULL auto_increment,
    `numero` int(15) NOT NULL default '0',
    `nome` varchar(155) NOT NULL default '',
    `nascita` varchar(155) NOT NULL default '',
    `indirizzo` varchar(155) NOT NULL default '',
    `cap` varchar(155) NOT NULL default '',
    `localita` varchar(155) NOT NULL default '',
    `provincia` varchar(155) NOT NULL default '',
    `telefono` varchar(155) NOT NULL default '',
    `mobile` varchar(155) default NULL,
    `email` varchar(155) NOT NULL default '',
    `interessi` varchar(255) default 'N;',
    `privacya` char(1) NOT NULL default '',
    `privacyb1` char(1) default NULL,
    `privacyb2` char(1) default NULL,
    `privacyb3` char(1) default NULL,
    `privacyc1` char(1) default NULL,
    `privacyc2` char(1) default NULL,
    `privacyc3` char(1) default NULL,
    `stato` char(1) NOT NULL default '',
    `data` varchar(10) NOT NULL default '',
    `mailsent` char(1) NOT NULL default '',
    KEY `ID_fidelity` (`ID_fidelity`),
    FULLTEXT KEY `nome` (`nome`)
    );

    e

    CREATE TABLE `farma_punti` (
    `id_farmapunti` int(6) unsigned NOT NULL auto_increment,
    `numero_fidelity` varchar(255) NOT NULL default '',
    `data` varchar(10) NOT NULL default '',
    `tipo` varchar(255) NOT NULL default '',
    `punteggio_vendita` varchar(255) NOT NULL default '',
    `cod_prod` varchar(255) NOT NULL default '',
    `descr_prod` varchar(255) NOT NULL default '',
    `raggruppamento` varchar(155) NOT NULL default '',
    `quantita` varchar(255) NOT NULL default '',
    `prezzo` varchar(255) NOT NULL default '',
    `punteggio` varchar(255) NOT NULL default '',
    KEY `id_farmapunti` (`id_farmapunti`)
    );

    Il problema del numero dei records l'ho risolto ma la lentezza della visualizzazione della pagina rimane ancora. Ho eliminato uno dei due indici presenti ma non sembra cambiare molto.

    Volevo chiederti ho eliminato l'indice corretto?

    Ho provato a fare una query senza INNER JOIN ma solo su una tabella e la pagina va che una bellezza quindi il problema presumo che sia nell'incrocio delle due tabelle. Sapresti darmi un consiglio per snellire il codice in modo che la pagina possa andare veloce con una query su due tabelle?

    Ringrazio in anticipo per il vostro aiuto.

  8. #8
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    Ciao,
    in base alla query dovresti avere indici su:
    farma_fidelity.numero
    farma_punti.numero_fidelity

    Questi sono infatti i campi che vengono usati dalla JOIN per legare le tabelle.
    think simple think ringo

  9. #9
    $query_content = "SELECT campi , SUM(prezzo) as top FROM farma_fidelity INNER JOIN farma_punti ON farma_fidelity.numero = farma_punti.numero_fidelity WHERE farma_fidelity.nome like '%$_GET[i]%' GROUP BY farma_punti.numero_fidelity ORDER BY farma_punti.prezzo DESC";

    Se non ti serve la stampa di tutti i campi nella query non inserire * (all) seleziona i campi che ti servono poi ricorda che nel WHERE va dichiarato il campo a che tabella si riferisce sopra ti ho sistemato la query sostituisci capi con quelli che devi estrarre e fai una prova

  10. #10
    perfetto, funziona tutto alla perfezione. Grazie mille per l'aiuto.

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.