Torna indietro   Hardware Upgrade Forum > Software > Programmazione

AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-06-2009, 17: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, 20: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, 20: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, 23: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, 23: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, 23: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, 23: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, 23: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, 08: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, 09: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, 09: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, 09: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, 12: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


AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Vast prosegue la costruzione della stazi...
Chiarito cosa è successo al satel...
Il TAR annulla Bologna Città 30. ...
Laptop con chip NVIDIA da marzo? Emergon...
Costruito in casa, più veloce di ...
Il nuovo Galaxy Book 6 Pro costa il 25% ...
C'è un boom del mercato dei data ...
OVHcloud annuncia la disponiiblità...
Il Wi-Fi 7 ha un nuovo re: da ASUS arriv...
In arrivo l'auto "Frankenstein"...
Chip NVIDIA H200 in Cina? 'Come vendere ...
iPhone 16 torna super conveniente: ora c...
Offerte Amazon pazzesche: tech, smartpho...
Ubisoft annuncia l'arrivo dei 60 fps per...
Infratel Italia: ecco la nuova mappa del...
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: 23:30.


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