很简单的一条语句
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高手能指点。
那确实有可能用不到cardid上这个索引。我猜测mysql是这样查询的:首先把符合条件的ticket表中的数据全部查出来,然后遍历查出来的数据,取其中的cardid,去card表中查询id等于cardid的数据。这两步都不会用到cardid上的索引。
只查 cardId 不会发生回表操作。select * 可能是 数据库优化器认为 先 查询cardId 后回表代价较大。直接忽略了
直接select * 不好用索引
select 后罗列出你要查询的字段,
这些字段常用的话,就把这些字段建一个联合索引,注意顺序
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 试试
换成左连接的sql你怎么写的。索引建立在哪个字段?
– 会长 4年前@会长: 索引建立在 Card_Id 字段上
– yzy 4年前@会长: 左连接查询语句 SELECT * FROM
– yzy 4年前ticket
a LEFT JOIN card b ON a.Card_Id=b.Id WHERE Org='1'