年龄[1,2,3]与1和3之间的年龄相比

时间:2011-04-24 09:21:20

标签: mysql sql database

我有一个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将使用列年龄的索引而第二个不能使用。是吗?哪种性能更好?

5 个答案:

答案 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问题的答案有用:

MYSQL OR vs IN [vs BETWEEN] performance

答案 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记录。