如何优化枚举类型的查询

时间:2020-05-01 14:33:07

标签: mysql sql select query-optimization where-clause

我有一个相对简单的查询:

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

projects表具有约32万条记录,并且 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 个答案:

答案 0 :(得分:1)

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