Простой ответ - создать отдельные индексы из одного столбца для каждого запроса:
create index ix1 (device); -- no need to create it since it's the PK.
create index ix2 (pin);
create index ix3 (authToken);
Первый индекс (из PK) использует первичный индекс.Второй и третий могут быть медленнее, поскольку они страдают от медлительности «вторичного индекса»: им всегда нужно сначала получить доступ к вторичному индексу, а затем получить доступ к первичному индексу;это может стать медленным, если вы выбираете большое количество строк.
Теперь, если вы хотите перебраться с точки зрения скорости SELECT
за счет медлительности модификаций (INSERT
, UPDATE
и DELETE
), вы можете использовать «покрывающие индексы» с учетом каждого запроса.Они должны выглядеть следующим образом:
create index ix4 (device, pin, authToken); -- [non needed] optimal for WHERE device = ?
create index ix5 (authToken, device, pin); -- optimal for WHERE authToken = ?
create index ix6 (pin, device, authToken); -- optimal for WHERE pin = ?
Примечание : Как указано Риком Джеймсом, ix4
избыточен с индексом первичного ключа, который имеют таблицы InnoDB.Там нет необходимости создавать его.Он приведен здесь только для полноты.
Эти "покрывающие индексы" используют только вторичные индексы, разрешая запрос без необходимости доступа к первичному индексу вообще.Они намного быстрее для большого количества извлеченных строк.