ВОЗРАСТ [1, 2, 3] против ВОЗРАСТА МЕЖДУ 1 И 3 - PullRequest
3 голосов
/ 24 апреля 2011

У меня есть таблица 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 ]

8 голосов
/ 24 апреля 2011

Оба запроса будут использовать индекс.

Запрос A будет переведен на:

select * from person where age = 1 or age = 2 or age 3;

Запрос B будет переведен в

select * from person where age >= 1 and age <= 3;

Таким образом, запрос A выполнит 3 теста, используя OR.
Запрос B выполнит 2 теста, используя AND.

Запрос B. быстрее.

Обычно запросы с использованием AND выполняются быстрее, чем запросы с использованием OR.
Кроме того, Query B выполняет меньше тестов, и поскольку он тестирует диапазон, ему легче исключать результаты, которые ему не нужны.

2 голосов
/ 24 апреля 2011

На моем нетбуке прямо сейчас не установлен сервер MySQL, но придерживаясь инструкции EXPLAIN, вы можете получить ответ, который ищете:

EXPLAIN SELECT * FROM Person WHERE age IN [1, 2, 3];
EXPLAIN SELECT * FROM Person WHERE age BETWEEN 1 AND 3;
1 голос
/ 24 апреля 2011

Вы можете найти ответы на этот вопрос StackOverflow полезными:

MYSQL ИЛИ против IN [против МЕЖДУ] производительность

0 голосов
/ 17 апреля 2015
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];

, вы можете попробовать с 1 миллионами записей mysql db.

0 голосов
/ 24 апреля 2011
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];

должен дать вам точный ответ на ваш точный запрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...