Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di pyotrex
    Registrato dal
    Feb 2003
    Messaggi
    554

    [Mysql 4.1.22][PHP 5.2.5] upgrade a php5 mysql4 query lenta

    Ciao a tutti ho questa tabella che ha 27380 record

    Codice PHP:
    CREATE TABLE `dyn_carrello` (
      `
    idint(10unsigned NOT NULL auto_increment,
      `
    id_utenteint(5unsigned NOT NULL default '0',
      `
    numerovarchar(50NOT NULL default '',
      `
    sconto_pianificazionefloat(5,2unsigned NOT NULL default '0.00',
      `
    sconto_ruolofloat(5,2unsigned NOT NULL default '0.00',
      `
    sconto_qtafloat(5,2unsigned NOT NULL default '0.00',
      `
    sconto_discrezionalefloat(5,2unsigned NOT NULL default '0.00',
      `
    prezzofloat(8,2unsigned NOT NULL default '0.00',
      `
    qtaint(10unsigned NOT NULL default '0',
      `
    id_ordinevarchar(11NOT NULL default '',
      `
    nota_rigavarchar(255) default NULL,
      
    PRIMARY KEY  (`id`)
    ENGINE=MyISAM AUTO_INCREMENT=256009 DEFAULT CHARSET=latin1 PACK_KEYS=0 AUTO_INCREMENT=256009 
    precedentemente usavo php4 e mysql3 e il campo id_ordine era un INT e tutto filava liscio, poi per esigenze imposte da modifiche richieste, il campo id_ordine è diventato un VARCHAR, php5 e mysql4, eseguendo questa query

    Codice PHP:
    SELECT dyn_catalogo . * , dyn_carrello.qtadyn_carrello.nota_riga
    FROM dyn_carrello
    INNER JOIN dyn_catalogo ON dyn_carrello
    .numero dyn_catalogo.numero
    WHERE dyn_carrello
    .id_utente '7'
    AND dyn_carrello.id_ordine '0'
    ORDER BY dyn_catalogo.codice 
    che per altro restituisce un record la query diventa talmente lenta da restituire Fatal error: Maximum execution time of 30 seconds exceeded in... ho provato anche per curiosità a riportare il campo id_ordine a int, ma non cambia nulla, l'unica cosa che rende la query gestibile è la rimozione di ORDER BY che però a me serve, tengo a precisare che tutto gira in locale sul mio portatile, come detto sopra, la stessa query su php4 e mysql3 è una scheggia, a questo punto mi e vi chiedo, c'è qualcosa che non va nella mia installazione php-mysql oppure le caratteristiche dell'ambiente aggiornato php-mysql richiedono delle modifiche nella query?
    Vivrò una vita intera e fortunatamente morirò una volta sola

  2. #2
    il problema potrebbe essere quel "dyn_catalogo .*", quanti campi ha dyn_catalogo?
    ti servono veramente tutti?

    altrimenti potresti scindere in 2 la query trovando prima il dyn_carrello.numero e poi vai sul dyn_catalogo...

    vedi come va! e facci sapere
    "Due cose riempiono l’animo di ammirazione e venerazione sempre nuova e crescente, quanto piú spesso e piú a lungo la riflessione si occupa di esse: il cielo stellato sopra di me, e la legge morale in me..." Immanuel Kant

  3. #3
    Posta anche la struttura di dyn_catalogo, altrimenti si brancola nel buio.

  4. #4
    Originariamente inviato da ntd
    Posta anche la struttura di dyn_catalogo, altrimenti si brancola nel buio.
    si forse è meglio!
    "Due cose riempiono l’animo di ammirazione e venerazione sempre nuova e crescente, quanto piú spesso e piú a lungo la riflessione si occupa di esse: il cielo stellato sopra di me, e la legge morale in me..." Immanuel Kant

  5. #5
    Utente di HTML.it L'avatar di pyotrex
    Registrato dal
    Feb 2003
    Messaggi
    554
    Codice PHP:
    CREATE TABLE `dyn_catalogo` (
      `
    idint(7unsigned NOT NULL auto_increment,
      `
    id_produttoreint(5unsigned NOT NULL default '0',
      `
    id_padreint(6unsigned NOT NULL default '0',
      `
    id_fileint(7unsigned default NULL,
      `
    numerovarchar(50) default NULL,
      `
    codicevarchar(50) default NULL,
      `
    eanvarchar(50) default NULL,
      `
    qtaint(6unsigned default NULL,
      `
    evidenzaint(1unsigned NOT NULL default '0',
      `
    offertaint(1unsigned NOT NULL default '0',
      `
    novitaint(1unsigned NOT NULL default '0',
      `
    classechar(2NOT NULL default '',
      `
    sort_cint(7unsigned default NULL,
      `
    sort_pint(7unsigned default NULL,
      `
    selettoreint(1unsigned NOT NULL default '0',
      `
    confezioniint(4unsigned default NULL,
      
    PRIMARY KEY  (`id`)
    TYPE=MyISAM AUTO_INCREMENT=11593 
    475 record
    Vivrò una vita intera e fortunatamente morirò una volta sola

  6. #6

    Re: [Mysql 4.1.22][PHP 5.2.5] upgrade a php5 mysql4 query lenta

    Originariamente inviato da pyotrex
    codice:
    SELECT dyn_catalogo . * , dyn_carrello.qta, dyn_carrello.nota_riga
    FROM dyn_carrello
    INNER JOIN dyn_catalogo ON dyn_carrello.numero = dyn_catalogo.numero
    WHERE dyn_carrello.id_utente = '7' AND dyn_carrello.id_ordine = '0'
    ORDER BY dyn_catalogo.codice
    Probabilmente hai perso tutti gli indici durante il trasferimento del database perché nelle strutture non ne vedo neanche uno.

    Comunque, a spanne, per ottimizzare la query che hai descritto devi indicizzare i seguenti campi:
    codice:
    in dyn_carrello:
      numero
      id_utente
      id_ordine
    in dyn_catalogo:
      numero
      codice
    Inoltre, dyn_carrello.id_utente è numerico, quindi non devi metterlo fra apici.

    Se vuoi ottimizzare questo database, considera seriamente di cambiare i vari id in valori numerici e, se non possibile, di usare almeno CHAR invece di VARCHAR.

  7. #7
    Utente di HTML.it L'avatar di pyotrex
    Registrato dal
    Feb 2003
    Messaggi
    554

    Re: Re: [Mysql 4.1.22][PHP 5.2.5] upgrade a php5 mysql4 query lenta

    Originariamente inviato da ntd
    Probabilmente hai perso tutti gli indici durante il trasferimento del database perché nelle strutture non ne vedo neanche uno.
    in entrambe le tabelle ci sono "solo" i campi id dichiarati come primary key, in automatico dovrebbero essere anche index, correggimi se sbaglio.

    Comunque, a spanne, per ottimizzare la query che hai descritto devi indicizzare i seguenti campi:
    codice:

    in dyn_carrello:
    numero
    id_utente
    id_ordine
    in dyn_catalogo:
    numero
    codice



    Inoltre, dyn_carrello.id_utente è numerico, quindi non devi metterlo fra apici.

    Se vuoi ottimizzare questo database, considera seriamente di cambiare i vari id in valori numerici e, se non possibile, di usare almeno CHAR invece di VARCHAR.
    ok

    ma volevo anche capire come mai con mysql 4.1 e php 4 su server web la query è velocissima, in locale con mysql3 e php4 anche, mentre sempre in locale con mysql4 e php5 diventa lentissima, io in php.ini (php5) ho attivato l'estensione mysql e mysqli, anche se in questo codice uso mysql
    Vivrò una vita intera e fortunatamente morirò una volta sola

  8. #8

    Re: Re: Re: [Mysql 4.1.22][PHP 5.2.5] upgrade a php5 mysql4 query lenta

    Originariamente inviato da pyotrex
    in entrambe le tabelle ci sono "solo" i campi id dichiarati come primary key, in automatico dovrebbero essere anche index, correggimi se sbaglio.
    Quando esporto la struttura, io vedo tutti campi indicizzati. Per esempio, in questa mia tabella il campo _creation è indicizzato:
    codice:
    CREATE TABLE IF NOT EXISTS `ntd_request` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `_creation` date NOT NULL,
      `contact` varchar(50) collate utf8_bin NOT NULL COMMENT 'category=required',
      `subject` varchar(50) collate utf8_bin NOT NULL COMMENT 'category=required',
      `content` varchar(200) collate utf8_bin NOT NULL COMMENT 'category=required|widget=textarea',
      PRIMARY KEY  (`id`),
      KEY `_creation` (`_creation`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=0 ;
    Originariamente inviato da pyotrex
    ma volevo anche capire come mai con mysql 4.1 e php 4 su server web la query è velocissima, in locale con mysql3 e php4 anche, mentre sempre in locale con mysql4 e php5 diventa lentissima, io in php.ini (php5) ho attivato l'estensione mysql e mysqli, anche se in questo codice uso mysql
    Non è il PHP, ci metterei la salciccia sulla graticola. Secondo me, come sopra accennato, hai un problema di indici nelle varie versioni di MySQL. Puoi verificarlo facilmente con phpMyAdmin (se puoi usarlo) o similari.

  9. #9
    Utente di HTML.it L'avatar di pyotrex
    Registrato dal
    Feb 2003
    Messaggi
    554
    Ho capito perfettamente il discorso degli indici, questa è l'esportazione delle 2 tabelle sul server web fatta tramite phpadmin, qui c'è mysql4 e php4 e la query è veloce

    CREATE TABLE `dyn_carrello` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `id_utente` int(5) unsigned NOT NULL default '0',
    `numero` varchar(50) NOT NULL default '',
    `sconto_pianificazione` float(5,2) unsigned NOT NULL default '0.00',
    `sconto_ruolo` float(5,2) unsigned NOT NULL default '0.00',
    `sconto_qta` float(5,2) unsigned NOT NULL default '0.00',
    `sconto_discrezionale` float(5,2) unsigned NOT NULL default '0.00',
    `prezzo` float(8,2) unsigned NOT NULL default '0.00',
    `qta` int(10) unsigned NOT NULL default '0',
    `id_ordine` int(10) unsigned NOT NULL default '0',
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0 AUTO_INCREMENT=320993 ;

    CREATE TABLE `dyn_catalogo` (
    `id` int(7) unsigned NOT NULL auto_increment,
    `id_produttore` int(5) unsigned NOT NULL default '0',
    `id_padre` int(6) unsigned NOT NULL default '0',
    `id_file` int(7) unsigned default NULL,
    `numero` varchar(50) default NULL,
    `codice` varchar(50) default NULL,
    `ean` varchar(50) default NULL,
    `qta` int(6) unsigned default NULL,
    `evidenza` int(1) unsigned NOT NULL default '0',
    `offerta` int(1) unsigned NOT NULL default '0',
    `novita` int(1) unsigned NOT NULL default '0',
    `classe` varchar(2) NOT NULL default '',
    `sort_c` int(7) unsigned default NULL,
    `sort_p` int(7) unsigned default NULL,
    `selettore` int(1) unsigned NOT NULL default '0',
    `confezioni` int(4) unsigned default NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1379 ;
    Vivrò una vita intera e fortunatamente morirò una volta sola

  10. #10

    Re: Re: [Mysql 4.1.22][PHP 5.2.5] upgrade a php5 mysql4 query lenta

    Non so che dirti, anche quest'ultimo non ha indici e non è ottimizzato. Ha di diverso che parecchi id sono numerici e la tabella dyn_catalogo è molto più piccola (e quindi è naturale sia più veloce).

    Originariamente inviato da ntd
    Comunque, a spanne, per ottimizzare la query che hai descritto devi indicizzare i seguenti campi:
    codice:
    in dyn_carrello:
      numero
      id_utente
      id_ordine
    in dyn_catalogo:
      numero
      codice
    Ma hai problemi ad aggiungere questi indici? Una volta fatto, prova questa query direttamente da phpMyAdmin e dimmi quanto tempo ci mette:

    codice:
    SELECT dyn_catalogo.*, dyn_carrello.qta, dyn_carrello.nota_riga
    FROM dyn_carrello INNER JOIN dyn_catalogo ON dyn_carrello.numero = dyn_catalogo.numero
    WHERE dyn_carrello.id_utente = 7 AND dyn_carrello.id_ordine = '0'
    ORDER BY dyn_catalogo.codice

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