|
|
|
![]() |
|
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: 22:22.