Torna indietro   Hardware Upgrade Forum > Software > Programmazione

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
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 ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
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


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...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Bentornati nel 2007: le memorie DDR3 rin...
Stellantis aderisce ad AI4I e Fondazione...
Google Pixel 10a: prime conferme sul pre...
ISRO potrebbe lanciare la capsula Gagany...
Un nuovo leak conferma dimensioni e novi...
Steam Machine: requisiti Verified piu' s...
NVIDIA GeForce RTX 5070 Ti fuori produzi...
Sony ha annunciato i nuovi giochi che en...
IBM Sovereign Core: la sovranità ...
Cerchi un'asciugatrice conveniente su Am...
Ayaneo Pocket Play arriverà in ri...
iPad Pro 11'' con chip M4 scende a 949€ ...
The Sims entra in una nuova era, ma l'ac...
Netflix, Disney o Prime Video: qual &egr...
Perplexity blocca la generazione di imma...
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: 00:38.


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