Ответ 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