MySQL Server versión: 5.1.41 En Ubuntu 10.04MySQL puntos de vista o cláusula IN vs
me encontré con una diferencia en el comportamiento de MySQL al modificar algunas consultas y quería saber la razón para ello.
Básicamente estoy creando una vista. Cuando consulto la vista, el conjunto de resultados es el mismo Sin embargo, el número de filas leídas es diferente para una cláusula IN
que para una cláusula OR
. A continuación a continuación es un ejemplo sencillo:
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;
El 2 explican las declaraciones siguientes muestran diferente número de filas analizado
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)
Uso de la cláusula 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)
Si nos fijamos en las "filas "en ambas consultas: se suman de manera diferente
La consulta conLa cláusulalee menos filas en comparación con IN
, que se suma a las tablas y combinaciones grandes.
¿Alguien me puede ayudar a entender por qué es así?
Gracias por su tiempo.
siempre el mismo pero con diferentes resultados? –
@Marcus - estoy seguro de que no entendí la pregunta - si querías decir que obtuve un resultado coherente cada vez y el número de filas analizadas cada vez también es consistente - entonces la respuesta es sí – naveen
@Marcus Adams - había una copia pegada error de mi parte, lo he corregido. El problema no es sobre diferentes conjuntos de resultados, los conjuntos de resultados son los mismos, pero el número de filas leídas es diferente entre IN y OR. Avíseme si no puede reproducirlo. Estoy en la versión del servidor: 5.1 – naveen