Подтвердить что ты не робот

Понимание нескольких индексов столбцов в запросе MySQL

Вот запрос:

SELECT * FROM table WHERE accountid = 1 ORDER BY logindate DESC LIMIT 1

Теперь, если я добавил индекс с несколькими столбцами в полях:

INDEX(accountid,logindate)

Будет ли MySQL использовать этот индекс с несколькими столбцами? Или он не будет использовать его, потому что одно поле находится в предложении where, а другое - в инструкции заказа? Или это не имеет значения, если я использую поля в порядке индекса нескольких столбцов?

4b9b3361

Ответ 1

Хороший вопрос.

Показатели работают слева направо, поэтому ваши критерии WHERE будут использовать индекс. Сорт также будет использовать индекс в этом случае (план выполнения ниже).

Из руководства :

Индекс также может использоваться, даже если ORDER BY не соответствует индексу точно, пока все неиспользуемые части индекса и все дополнительные столбцы ORDER BY являются константами в предложении WHERE. Следующие запросы используют индекс для разрешения части ORDER BY:

SELECT * FROM t1
WHERE key_part1=constant
ORDER BY key_part2;

Если у вас есть один индекс столбца (accountid), вместо него будет использоваться файловый порт. Поэтому ваш запрос извлекает выгоду из этого индекса.


Два индекса столбца

create table t1 (
  accountid tinyint,
  logindate date);

create index idx on t1 (accountid, logindate);

insert into t1 values (1, '2012-09-05'), (2, '2012-09-09'), (3, '2012-09-04'), 
    (1, '2012-09-01'), (1, '2012-09-26'), (2, '2012-05-16'), 
    (1, '2012-09-01'), (3, '2012-10-19'), (1, '2012-03-01')

План выполнения

ID  SELECT_TYPE  TABLE  TYPE  POSSIBLE_KEYS  KEY  KEY_LEN  REF   ROWS  FILTERED  EXTRA
1   SIMPLE       t1     ref   idx            idx  2        const 5     100       Using where; Using index

Индекс одиночной колонки

create table t1 (
  accountid tinyint,
  logindate date);

create index idx on t1 (accountid);

insert into t1 values (1, '2012-09-05'), (2, '2012-09-09'), (3, '2012-09-04'), 
    (1, '2012-09-01'), (1, '2012-09-26'), (2, '2012-05-16'), (1, '2012-09-01'), 
    (3, '2012-10-19'), (1, '2012-03-01')

План выполнения

ID  SELECT_TYPE  TABLE  TYPE   POSSIBLE_KEYS  KEY  KEY_LEN  REF   ROWS  FILTERED  EXTRA
1   SIMPLE       t1     range  idx            idx  2              5     100       Using where; Using filesort