Mysql - как создавать индексы для запроса с помощью WHERE и GROUP BY - PullRequest
1 голос
/ 09 июля 2020

Я работаю с MySQL (MyISAM) DB.

У меня есть такой запрос:

select c1, c2, c3, MAX(c5) from T where c4=#string_value# group by c1, c2, c3

- c[1-4] are varchar(255)
- c5 is an integer

Я пробовал два индекса:

  • "c1_c2_c3_idx" для (c1, c2, c3) - что делает работу запроса в 3 раза медленнее
  • "c4_idx" для (c4) - что делает запрос в 5 раз быстрее

Может, есть способ создать еще более быстрый индекс?

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Я считаю, что следующий индекс является оптимальным:

CREATE INDEX idx ON T (c4, c1, c2, c3, c5);

Индекс начинается с c4, которое появляется в предложении WHERE, которое является первой частью выполнения запроса. Затем мы добавляем c1, c2 и c3, чтобы охватить предложение GROUP BY. После этого мы добавляем c5, что позволит MySQL быстрее найти MAX(c5).

Обратите внимание, что указанный выше индекс можно сказать, что покрывает весь запрос , потому что MySQL может использовать только индекс для удовлетворения всего плана запроса, без необходимости возвращаться к кластеризованному индексу (таблице).

1 голос
/ 09 июля 2020

Лучший индекс должен быть основан на условии, где ...

 create index  idx1 on T ( c4) 

, чтобы избежать доступа к таблице данных и использовать только информацию, содержащуюся в индексе, вы также можете попробовать использовать избыточный индекс, добавив соответствующий столбец в других пунктах

create index  idx1 on T ( c4, c1,c2,c3,c5) 

оставляя крайний левый столбец

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