gpt4 book ai didi

mysql select with in子句不使用索引

转载 作者:可可西里 更新时间:2023-11-01 07:37:52 24 4
gpt4 key购买 nike

我有一个主键为 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.0098 秒内获取

然而,当我使用 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

1 行在 9 秒内获取

解释计划-

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 遍历所有匹配记录并将它们与子句中的值进行比较,一次一行。

因此,您能做的最好的事情就是在 deleted 上使用索引,并且您只会遍历 deleted = 0 的记录。

关于mysql select with in子句不使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8610325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com