|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
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 | |
+-----------------+-----------------------+------+-----+---------+----------------+
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'; 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'; 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 |
|
|
|
|
|
#2 |
|
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
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 2008
Messaggi: 1426
|
un augurio niente di +...
purtroppo non so aiutarti... |
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Jun 2009
Città: Roma
Messaggi: 102
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
|
|
|
|
|
#6 |
|
Senior Member
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';
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#7 | |
|
Bannato
Iscritto dal: Jun 2009
Messaggi: 44
|
Quote:
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)
|
|
|
|
|
|
|
#8 |
|
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
|
|
|
|
|
|
#9 |
|
Senior Member
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. |
|
|
|
|
|
#10 | |
|
Bannato
Iscritto dal: Jun 2009
Messaggi: 44
|
Quote:
ora correggo e mando in stampa...grazie !!! LA BEETWEN per cosa? Tnx |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
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. |
|
|
|
|
|
|
#12 |
|
Bannato
Iscritto dal: Jun 2009
Messaggi: 44
|
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
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. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:02.




















