MySQL Server versione: 5.1.41 su Ubuntu 10.04MySQL viste o vs clausola IN
mi sono imbattuto in una differenza di comportamento di MySQL quando si modificano alcune query e voleva sapere la ragione per questo.
Fondamentalmente sto creando una vista. Quando interrogo la visualizzazione, il set di risultati è lo stesso Tuttavia, il numero di righe lette è diverso per una clausola IN
rispetto a una clausola OR
. Sotto sotto è un semplice esempio:
CREATE TABLE country (
id_country int(11) NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
PRIMARY KEY (id_country)
) ENGINE=InnoDB;
INSERT INTO country (name) VALUES ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H');
CREATE TABLE status (
id_status int(11) NOT NULL AUTO_INCREMENT,
id_country int(11) NOT NULL,
status tinyint(4) NOT NULL,
PRIMARY KEY (id_status)
) ENGINE=InnoDB;
ALTER TABLE status ADD INDEX (id_country);
ALTER TABLE status ADD FOREIGN KEY (id_country) REFERENCES test.country (id_country) ON DELETE RESTRICT ON UPDATE RESTRICT ;
INSERT INTO status(id_country, status) VALUES
(1,0), (2,1), (3,0), (4,1), (5,0),(6,1), (7,0), (8,1);
CREATE ALGORITHM=MERGE VIEW view_country
AS
SELECT c.*, s.id_status, s.status
FROM country c JOIN status s ON c.id_country = s.id_country;
Il 2 spiegano le dichiarazioni che seguono mostrano diverso numero di righe analizzato
mysql> EXPLAIN EXTENDED SELECT * FROM view_country WHERE id_country IN (1, 2, 3)\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: c
type: range
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: NULL
rows: 3
filtered: 100.00
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: s
type: ref
possible_keys: id_country
key: id_country
key_len: 4
ref: test.c.id_country
rows: 1
filtered: 100.00
Extra:
2 rows in set, 1 warning (0.00 sec)
Utilizzando la clausola OR
mysql> EXPLAIN EXTENDED SELECT * FROM view_country WHERE id_country = 1 OR id_country = 2 OR id_country = 3\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: s
type: ALL
possible_keys: id_country
key: NULL
key_len: NULL
ref: NULL
rows: 8
filtered: 37.50
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: c
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: test.s.id_country
rows: 1
filtered: 100.00
Extra:
2 rows in set, 1 warning (0.00 sec)
Se si guardano le "righe "in entrambe le query - si sommano in modo diverso
La query conLa clausolalegge meno righe rispetto a IN
, che si aggiunge a tabelle e join enormi.
Qualcuno può aiutarmi a capire perché è così?
Grazie per il vostro tempo.
Coerentemente lo stesso, ma risultati diversi? –
@Marcus - io sono sy non ho capito la domanda - se volevi ottenere sempre un risultato coerente ogni volta e il numero di righe analizzate ogni volta è anche coerente - allora la risposta è sì – naveen
@Marcus Adams - c'era una copia incolla errore mio da parte mia - l'ho corretto. Il problema non riguarda set di risultati diversi: i set di risultati sono uguali, ma il numero di righe lette è diverso tra IN e OR - fammi sapere se non sei in grado di riprodurlo - sono sulla versione server: 5.1 – naveen