In 查询实验结果
-
问题:In到底能不能匹配上索引?
-
先说结论,如果无需回表时,则全部都会有索引,无论数据量大小。如果查询需要回表,那么如果查询数量
-
测试表结构:

-
表索引:id、grade(表内数据均分为四个grade)
-
数据量:123条
-
In 不回表时查询性能测试(返回结果只有id,没有其他数据,只在主键表里做操作)
-
测试情况:In条件里是连续id,数据量小于总数据量20%时:
- 结论:会走主键索引,但是此时查询类型为范围查询,且实际扫描到了100条数据。
explain select id from game_stage where id in (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)

-
In条件里是连续id,数据量大于总数据量20%时:
- 结论:
explain select id from game_stage where id in (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25)

-
In条件里,id设置为有规律的分散,10、20、30这样的数据。且数量大于20%时
- 结论:会不走索引,此时走的全表扫描。
- explain select id from game_stage where id in (0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99)

-
in条件里,id设置为有规律的分散,10、20、30这样的数据。且数量小于20%时
- 结论:查询类型是range类型
- explain select id from game_stage where id in (0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57)

-
In条件里id是两个连续段,且小于20%
explain select id from game_stage where id in (0,1,2,3,4,5,6,7,8,9,10,90,91,92,93,94,95,96,97,98,99)

explain select id from game_stage where id in (0,1,2,3,4,5,6,7,8,9,10,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99)
