Как оптимизировать, где запрос с типом enum - PullRequest
0 голосов
/ 01 мая 2020

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

 select client_coordinator_id
    from projects 
    where status not in ("DELETED", "ARCHIVED")
    and client_coordinator_id > 0
    group by client_coordinator_id

В таблице проектов содержится около 320 тыс. Записей, и оба столбца client_coordinator_id и status имеют индексы, и запрос по-прежнему занимает около 0,7 секунды.

статус имеет тип ENUM.

EXPLAIN дает следующее:

id - 1
select_type - SIMPLE
table - projects 
partitions - null
type - index
possible_keys - status,client_coordinator_idx,status_project_batch_id_idx,idx_status_new_status_id
key - client_coordinator_idx
key_len - 4
ref - null
rows - 311837
filtered - 40.00
Extra - using where

Что я здесь не так делаю? Есть идеи, что не так с этим запросом?

1 Ответ

1 голос
/ 01 мая 2020

столбцы client_coordinator_id и status имеют индексы

Я бы рекомендовал индекс для обоих столбцов, а не отдельные индексы для каждого столбца. Итак:

create index ix_projects on projects(status, client_coordinator_id)

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

create index ix_projects on projects(client_coordinator_id, status)

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

Также совершенно непонятно, почему вы используете group by, но функция агрегирования не появляется в select п. Предположительно, вы хотите select distinct вместо этого. Это не обязательно улучшит производительность, но прояснит намерение:

select distinct client_coordinator_id
from projects 
where status not in ('DELETED', 'ARCHIVED')
and client_coordinator_id > 0
...