我有一个InnoDB表和age
列上的索引就像这样
CREATE TABLE Person (
....
age int(11) not null;
key (age);
....
) engine=InnoDB;
我只是想知道这些查询背后的真实内容:
SELECT * FROM Person WHERE age IN [1, 2, 3];
和
SELECT * FROM Person WHERE age BETWEEN 1 AND 3;
正如我所了解的那样,第一个MySQL将使用列年龄的索引而第二个不能使用。是吗?哪种性能更好?
答案 0 :(得分:8)
两个查询都将使用索引。
查询A将转换为:
select * from person where age = 1 or age = 2 or age 3;
查询B将转换为
select * from person where age >= 1 and age <= 3;
因此查询A将使用OR进行3次测试 查询B将使用AND进行2次测试。
查询B更快。
通常,使用AND
的查询比使用OR
的查询更快
此外,查询B正在进行更少的测试,因为它正在测试范围,因此可以更轻松地排除它不需要的结果。
答案 1 :(得分:2)
我目前没有在我的上网本上安装MySQL服务器,但坚持EXPLAIN
语句可能会给你你想要的答案:
EXPLAIN SELECT * FROM Person WHERE age IN [1, 2, 3];
EXPLAIN SELECT * FROM Person WHERE age BETWEEN 1 AND 3;
答案 2 :(得分:1)
您可能会发现此StackOverflow问题的答案有用:
答案 3 :(得分:0)
SELECT * FROM Person WHERE age IN [1, 2, 3];
相当于
SELECT * FROM Person WHERE age = 1 OR age = 2 OR age 3
,而
SELECT * FROM Person WHERE age BETWEEN 1 AND 3;
相当于
SELECT * FROM Person WHERE age >= 1 AND age <= 3
使用EXPLAIN
查看不同形式查询的实际执行计划。我也会惊讶地看到mysql没有使用带有BETWEEN
的索引。
EXPLAIN SELECT * FROM Person WHERE age BETWEEN 1 AND 3;
EXPLAIN SELECT * FROM Person WHERE age IN [1,2,3];
应该为您的确切查询提供准确的答案
答案 4 :(得分:0)
SELECT * FROM Person WHERE age >= 1 AND age <= 3
比SELECT * FROM Person WHERE age BETWEEN 1 AND 3;
和EXPLAIN SELECT * FROM Person WHERE age IN [1,2,3];
你可以尝试使用100万条mysql db记录。