Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Borderlands 4, tra divertimento e problemi tecnici
Recensione Borderlands 4, tra divertimento e problemi tecnici
Gearbox Software rilancia la saga con Borderlands 4, ora disponibile su PS5, Xbox Series X|S e PC. Tra le novità spiccano nuove abilità di movimento, un pianeta inedito da esplorare e una campagna che lascia al giocatore piena libertà di approccio
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
NXTPAPER 60 Ultra è il primo smartphone con tecnologia NXTPAPER 4.0 per il display, un ampio IPS da 7,2 pollici. Con finitura anti-riflesso, processore MediaTek Dimensity 7400, fotocamera periscopica e modalità Max Ink per il detox digitale, NXTPAPER 60 Ultra punta a essere il riferimento tra gli smartphone pensati per il benessere degli occhi.
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Questo mouse ultraleggero, con soli 36 grammi di peso, è stato concepito per offrire un'esperienza di gioco di alto livello ai professionisti degli FPS, grazie al polling rate a 8.000 Hz e a un sensore ottico da 33.000 DPI. La recensione esplora ogni dettaglio di questo dispositivo di gioco, dalla sua agilità estrema alle specifiche tecniche che lo pongono un passo avanti
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-06-2009, 16:42   #1
Trigger2009
Bannato
 
Iscritto dal: Jun 2009
Messaggi: 44
[MySql] Enorme dubbio su query...domani devo consegnare...please help me :-/

Ciao,
allora la situazione è la seguente: devo ottimizzare una query di questo tipo (facciamo subito l'esempio pratico):

Ho una tabella INSERZIONE fatta così:

Codice:
INSERZIONE:
mysql> DESCRIBE INSERZIONE;
+-----------------+-----------------------+------+-----+---------+----------------+
| Field           | Type                  | Null | Key | Default | Extra          |
+-----------------+-----------------------+------+-----+---------+----------------+
| Id_Oggetto      | int(11)               | NO   | PRI | NULL    | auto_increment |
| Titolo          | varchar(60)           | NO   | MUL | NULL    |                |
| Descrizione     | text                  | YES  |     | NULL    |                |
| Costo_Base      | decimal(6,2)          | YES  |     | NULL    |                |
| Compralo_Subito | decimal(6,2)          | YES  |     | NULL    |                |
| Scadenza        | datetime              | YES  | MUL | NULL    |                |
| Stato_Oggetto   | enum('nuovo','usato') | YES  |     | NULL    |                |
| Id_Venditore    | varchar(20)           | NO   |     | NULL    |                |
| Id_Categoria    | varchar(30)           | NO   |     | NULL    |                |
+-----------------+-----------------------+------+-----+---------+----------------+
I cui campi Titolo ed Oggetto sono indicizzati

La mia professoressa dice che se ho una query del tipo questa:

Codice:
SELECT Id_Venditore, Titolo, Descrizione, Costo_Base FROM INSERZIONE
WHERE Scadenza > '2009-05-27 01:28:00' AND Scadenza < '2009-05-27 01:28:05'
OR Titolo = 'Kommodor 64';
sarà lenta perchè MySql usa un solo indice per query (fà riferimento alla versione 5.0 di MySql) e se non può utilizzare nessun indice utilizza una full table scan.

Mentre se prendo la stessa query e la ristrutturo dividendola in 2 UNION:

Codice:
SELECT Id_Venditore, Titolo, Descrizione, Costo_Base FROM INSERZIONE
WHERE Scadenza > '2009-05-27 01:28:00' AND Scadenza < '2009-05-27 01:28:05'
UNION
SELECT Id_Venditore, Titolo, Descrizione, Costo_Base FROM INSERZIONE
WHERE Titolo = 'Kommodor 64';
sarà molto più veloce perchè avrà la possibilità di usare un indice per ogni UNION.

Ho un db molto popolato...le ho provate entrambe e danno risultati praticamente identici...come mai? cosa c'è di sbagliato?

Vi prego è urgentissimo...devo terminare entro questa sera...

Grazie
Trigger2009 è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2009, 19:56   #2
Trigger2009
Bannato
 
Iscritto dal: Jun 2009
Messaggi: 44
please...qualcuno che ci illumina? Sono le ultime ore buone per ricevere un'illuminazione...domani alle 11:00 consegno tuto e quel che è fatto è fatto e quel che non è fatto non è fatto
Trigger2009 è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2009, 19:59   #3
Mattyfog
Senior Member
 
Iscritto dal: Jul 2008
Messaggi: 1426
un augurio niente di +...
purtroppo non so aiutarti...
Mattyfog è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2009, 22:14   #4
Rintrah84
Bannato
 
Iscritto dal: Jun 2009
Città: Roma
Messaggi: 102
Quote:
Originariamente inviato da Mattyfog Guarda i messaggi
un augurio niente di +...
purtroppo non so aiutarti...
doh ci avevo sperato che qualcuno fosse passato ad illuminarmi...vabbè grazie dell'augurio....io glielo porto così...poi speriamo che il lavoro le vada bene...
Rintrah84 è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2009, 22:21   #5
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
Hai buttato un occhio all'explain della query?
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2009, 22:21   #6
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Spero solo di darti uno spunto dato che non sono a livelli universitari con i db.

Quello che volevo dirti di provare era semplicemente:

Codice:
SELECT Id_Venditore, Titolo, Descrizione, Costo_Base FROM INSERZIONE
WHERE Scadenza BETWEEN '2009-05-27 01:28:00' AND '2009-05-27 01:28:05'
UNION ALL
SELECT Id_Venditore, Titolo, Descrizione, Costo_Base FROM INSERZIONE
WHERE Titolo = 'Kommodor 64';
Non ho una mole di dati come la tua, non potrei neanche provare
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2009, 22:38   #7
Trigger2009
Bannato
 
Iscritto dal: Jun 2009
Messaggi: 44
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
Spero solo di darti uno spunto dato che non sono a livelli universitari con i db.

Quello che volevo dirti di provare era semplicemente:

Codice:
SELECT Id_Venditore, Titolo, Descrizione, Costo_Base FROM INSERZIONE
WHERE Scadenza BETWEEN '2009-05-27 01:28:00' AND '2009-05-27 01:28:05'
UNION ALL
SELECT Id_Venditore, Titolo, Descrizione, Costo_Base FROM INSERZIONE
WHERE Titolo = 'Kommodor 64';
Non ho una mole di dati come la tua, non potrei neanche provare
Ci mette sempre circa lo stesso tempo...poi di volta in volta che lo rieseguo cambia...nel senso che credo dipenda anche da quante risorse mi succhiano gli altri programmi...comunque anche questa versione ci mette circa lo stesso tempo dell'altra...
Cosa dovrebbe cambiare la tua versione dalla mia? dire UNION non è come dire UNION ALL?

posto gli EXPLAIN delle due query, riuscite a dirmi se la forma finale è la stessa e a motivarmela in qualche modo?

Codice:
QUERY ORIGINALE:

mysql> explain
    -> SELECT Id_Venditore, Titolo, Descrizione, Costo_Base FROM INSERZIONE
    -> WHERE Scadenza > '2009-05-27 01:28:00' AND Scadenza < '2009-05-27 01:28:05'
    -> OR Titolo = 'Kommodor 64'
    -> \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: INSERZIONE
         type: index_merge
possible_keys: Titolo,Scadenza_Index
          key: Scadenza_Index,Titolo
      key_len: 9,62
          ref: NULL
         rows: 4
        Extra: Using sort_union(Scadenza_Index,Titolo); Using where
1 row in set (0.00 sec)

QUERY CHE USA LA UNION:

mysql> EXPLAIN
    -> SELECT Id_Venditore, Titolo, Descrizione, Costo_Base FROM INSERZIONE
    -> WHERE Scadenza BETWEEN '2009-05-27 01:28:00' AND '2009-05-27 01:28:05'
    -> UNION ALL
    -> SELECT Id_Venditore, Titolo, Descrizione, Costo_Base FROM INSERZIONE
    -> WHERE Titolo = 'Kommodor 64'\G
*************************** 1. row ***************************
           id: 1
  select_type: PRIMARY
        table: INSERZIONE
         type: range
possible_keys: Scadenza_Index
          key: Scadenza_Index
      key_len: 9
          ref: NULL
         rows: 6
        Extra: Using where
*************************** 2. row ***************************
           id: 2
  select_type: UNION
        table: INSERZIONE
         type: ref
possible_keys: Titolo
          key: Titolo
      key_len: 62
          ref: const
         rows: 2
        Extra: Using where
*************************** 3. row ***************************
           id: NULL
  select_type: UNION RESULT
        table: <union1,2>
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: NULL
        Extra:
3 rows in set (0.01 sec)
Grazie
Trigger2009 è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2009, 22:41   #8
Trigger2009
Bannato
 
Iscritto dal: Jun 2009
Messaggi: 44
Dai ragazzi....illuminateci...io e Rintrah stiamo facendo questo progetto insieme...domani la proff lo controlla e dopomani esame orale...se non le va bene ci spella vivi a tutti e due
Trigger2009 è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2009, 07:24   #9
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
A differenza di cosa ha detto la professoressa, sembra proprio che invece MySql abbia operato una Merge di 2 indici. Nel piano di esecuzione puoi infatti leggere "index_merge", che ha svolto fondendo appunto insieme gli indici che avete messo sulle 2 colonne.

PS: Usa la BETWEEN sempre, in entrambe le scritture
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2009, 08:37   #10
Trigger2009
Bannato
 
Iscritto dal: Jun 2009
Messaggi: 44
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
A differenza di cosa ha detto la professoressa, sembra proprio che invece MySql abbia operato una Merge di 2 indici. Nel piano di esecuzione puoi infatti leggere "index_merge", che ha svolto fondendo appunto insieme gli indici che avete messo sulle 2 colonne.

PS: Usa la BETWEEN sempre, in entrambe le scritture
Ok,
ora correggo e mando in stampa...grazie !!! LA BEETWEN per cosa?

Tnx
Trigger2009 è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2009, 08:38   #11
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da Trigger2009 Guarda i messaggi
Ok,
ora correggo e mando in stampa...grazie !!! LA BEETWEN per cosa?

Tnx
WHERE Scadenza BETWEEN '2009-05-27 01:28:00' AND '2009-05-27 01:28:05'
anche nella prima query.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2009, 08:54   #12
Trigger2009
Bannato
 
Iscritto dal: Jun 2009
Messaggi: 44
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
WHERE Scadenza BETWEEN '2009-05-27 01:28:00' AND '2009-05-27 01:28:05'
anche nella prima query.
ok e a livello di prestazioni cambia qualcosa? perchè? come gli giustifico che èmeglio usar beetwen che specificare il range?
Trigger2009 è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2009, 11:16   #13
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da Trigger2009 Guarda i messaggi
ok e a livello di prestazioni cambia qualcosa? perchè? come gli giustifico che èmeglio usar beetwen che specificare il range?
Cambia a livello di engine, che sara' piu' stimolato ad usare una INDEX RANGE SCAN.
Oppure comunque ad ottimizzare il filtro durante l'esecuzione.

Quindi indirettamente anche prestazioni.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale TCL NXTPAPER 60 Ultra: lo smartphone che trasfor...
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza Sottile, leggero e dall'autonomia WOW: OPPO Reno...
La fucina di stelle Sagittario B2 &egrav...
Un razzo spaziale ULA Atlas V ha portato...
Silent Hill f vi farà scoprire la...
Leapmotor ha prodotto il suo milionesimo...
PlayStation Pulse Elevate: i primi altop...
Nove banche europee sfidano Tether e Cir...
Netflix: addio al piano Base senza pubbl...
Flight Simulator su PlayStation per la p...
Bosch taglierà 13.000 posti di la...
Nothing e CMF si separano: il brand low ...
Logitech MX Master 3S a 69€ su Amazon: i...
Colpo di scena su Windows 10: gli aggior...
HONOR, il futuro è foldable, ma n...
Motorola Solutions al servizio della sic...
Dell Pro Plus Earbuds: IA e controllo da...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:22.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v