首页 新闻 会员 周边 捐助

mysql in 不走索引

0
[待解决问题]

很简单的一条语句
SELECT * FROM ticket WHERE Card_Id IN(SELECT Id FROM card WHERE Org='1');
ticket表大概20万数据,card 大概2万数据, 这条in的子查询没有走索引。如果是card 表数据量很小的时候会走索引。
将上面的语句换成左连接查询也不走索引。
换成下面的写法可以正常走索引
SELECT Card_Id FROM ticket WHERE Card_Id IN(SELECT Id FROM card WHERE Org='1');
不知道是什么原因,哪位mysql高手能指点。

yzy的主页 yzy | 菜鸟二级 | 园豆:317
提问于:2020-10-10 17:00

换成左连接的sql你怎么写的。索引建立在哪个字段?

会长 4年前

@会长: 索引建立在 Card_Id 字段上

yzy 4年前

@会长: 左连接查询语句 SELECT * FROM ticket a LEFT JOIN card b ON a.Card_Id=b.Id WHERE Org='1'

yzy 4年前
< >
分享
所有回答(4)
0

那确实有可能用不到cardid上这个索引。我猜测mysql是这样查询的:首先把符合条件的ticket表中的数据全部查出来,然后遍历查出来的数据,取其中的cardid,去card表中查询id等于cardid的数据。这两步都不会用到cardid上的索引。

会长 | 园豆:12463 (专家六级) | 2020-10-12 09:10
0

只查 cardId 不会发生回表操作。select * 可能是 数据库优化器认为 先 查询cardId 后回表代价较大。直接忽略了

flyfishing | 园豆:943 (小虾三级) | 2020-10-12 15:40
0

直接select * 不好用索引
select 后罗列出你要查询的字段,
这些字段常用的话,就把这些字段建一个联合索引,注意顺序

水知寒 | 园豆:2 (初学一级) | 2020-10-12 17:47
0

SELECT Id FROM card WHERE Org='1'  返回数据太多导致索引失效;
SELECT Card_Id FROM ticket WHERE Card_Id IN(SELECT Id FROM card WHERE Org='1'); 用到的是覆盖索引;

用exists  替换in 试试

悟行 | 园豆:12559 (专家六级) | 2020-10-13 08:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册