一、看數據量
EXPLAIN
SELECT * from users WHERE is_doctor in (0,1);

很明顯沒走索引,下面再看一個sql。
EXPLAIN
SELECT * from users WHERE is_doctor in (2,1);

又走索引了,所以IN查詢走不走索引需要看rows的數據量,in (0,1)時查詢出52萬多數據量,全表才54萬數據量,in (2,1)時只有1萬多數據量。
EXPLAIN
SELECT * from users WHERE (is_doctor=0 or is_doctor=1);
與
EXPLAIN
SELECT * from users WHERE (is_doctor=2 or is_doctor=1);
也是同樣的道理
總結
IN通常是走索引的,當IN后面的數據在數據表中超過30%的匹配時是全表掃描,不走索引,因此IN走不走索引和后面的數據量有關系。
二、看IN后面是不是有子查詢
EXPLAIN
SELECT * from users WHERE is_doctor in (SELECT is_doctor from test_in_subselect);

