mysql索引查询 with_mysql select with in子句不使用索引

我有一个联系人表,其主键为id.它还有一个辅助索引idx_id_del_user(id,deleted,user_id).

以下查询使用索引,因此非常快 –

select id

from jts_contacts

where id = '00000402-25c8-7375-e3df-4ec5b66de11d'

and deleted = 0;

1行以0.0098s获取

但是,当我使用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

在9s中获取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子句将起作用,但由于这是来自现有产品的生成查询 – 因此无法更改为使用连接.

最佳答案 据我所知,IN遍历所有匹配的记录,并将它们与子句中的值进行比较,一次一行.

因此,您可以做的最好的事情是使用已删除的索引,并且您只会查看已删除= 0的记录.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值