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

Tru*_* Ha 3 mysql sql database

我有一个InnoDB表和age列上的索引就像这样

   CREATE TABLE Person (

      ....
      age int(11) not null;
      key (age);
      ....
   ) engine=InnoDB;
Run Code Online (Sandbox Code Playgroud)

我只是想知道这些查询背后的真实情况:

SELECT * FROM Person WHERE age IN [1, 2, 3];
Run Code Online (Sandbox Code Playgroud)

SELECT * FROM Person WHERE age BETWEEN 1 AND 3;
Run Code Online (Sandbox Code Playgroud)

正如我所学到的,第一个MySQL将使用列年龄的索引,而第二个不能使用.是吗?哪个性能更好?

Joh*_*ica 8

两个查询都将使用索引.

查询A将转换为:

select * from person where age = 1 or age = 2 or age 3;
Run Code Online (Sandbox Code Playgroud)

查询B将转换为

select * from person where age >= 1 and age <= 3;
Run Code Online (Sandbox Code Playgroud)

因此查询A将使用OR进行3次测试.
查询B将使用AND进行2次测试.

查询B更快.

通常,使用AND查询比使用查询更快OR.
此外,查询B正在进行更少的测试,并且因为它正在测试范围,所以它可以更轻松地排除它不想要的结果.