我有一个相对简单的查询:
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
我在这里做错了什么?知道这个查询有什么问题吗?
答案 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