MySQL服务器版本:5.1.41在Ubuntu 10.04MySQL的观点或VS IN子句
修改一些查询,当我遇到在MySQL的活动的差异来了,想知道它的原因。
基本上我正在创建一个视图。查询视图时,结果集相同 但是,对于IN
子句,读取的行数与对OR
子句而言是不同的。下面下面是一个简单的例子:
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;
2.解释下图显示不同的行数的语句解析
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)
使用或条款
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)
如果你看一下“行“在这两个查询中 - 它们的总和有所不同
查询有OR
子句与IN
相比读取的行数减少,这会加起来用于巨大的表和连接。
有人能帮我理解为什么这样吗?
谢谢你的时间。
始终相同,但不同的结果? – 2012-02-22 18:40:28
@Marcus - 我是sry我不明白这个问题 - 如果你的意思是我每次都得到一致的结果集,每次解析的行数也是一致的 - 那么答案是肯定的 – naveen 2012-02-23 17:39:22
@Marcus Adams - 有一个复制粘贴我的错误 - 我纠正了它。问题不是关于不同的结果集 - 结果集是相同的 - 但读取的行数与IN或OR不同 - 请告诉我,如果您无法重现它 - 我在服务器版本上:5.1 – naveen 2012-02-23 22:04:00