Trigger2009
29-06-2009, 16:42
Ciao,
allora la situazione è la seguente: devo ottimizzare una query di questo tipo (facciamo subito l'esempio pratico):
Ho una tabella INSERZIONE fatta così:
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:
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:
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
allora la situazione è la seguente: devo ottimizzare una query di questo tipo (facciamo subito l'esempio pratico):
Ho una tabella INSERZIONE fatta così:
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:
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:
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