我有一个联系人表,它的主键是id。它还有一个次要索引idx_id_del_user(id,deleted,user_id)。
以下查询使用了该索引,因此非常快 -
select id
from jts_contacts
where id = '00000402-25c8-7375-e3df-4ec5b66de11d'
and deleted = 0;
0.0098秒内检索到1行数据。
然而,当我使用in子句时,外部查询会进行全表扫描。我期望它使用主键或idx_id_del_user中的一个。
select *
from jts_contacts FORCE INDEX (idx_id_del_user)
where id in
(select id
from jts_contacts
where id = '00000402-25c8-7375-e3df-4ec5b66de11d')
and deleted = 0
9秒内获取了1行数据。
执行计划 -
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
------------------------------------------------------------------------------------
1, 'PRIMARY', 'jts_contacts', 'ALL', '', '', '', '', 1127275, 'Using where'
2, 'DEPENDENT SUBQUERY', 'jts_contacts', 'const', 'PRIMARY,idx_id_del_user', 'PRIMARY', '108', 'const', 1, 'Using index'
这个表有120万条记录,并且已经被分析了。我尝试了不使用FORCE INDEX选项,但仍然没有使用索引。对于加快此查询的速度有任何建议吗?
注意:使用联接而不是IN子句将起作用,但由于这是从现有产品生成的查询 - 不能修改以使用联接。