可以看到,字段 id 加了主键索引,age, nickname 都为普通索引,而 vocation 字段没有索引,现在是不是一下子明白了呢?下面分别对每个例子进行解释:
对于 SELECT * FROM `players` WHERE id IN (8, 5, 3);
由于查询条件 id 带有主键索引,MySQL返回数据时,如果查询的字段带有索引,会先根据索引排序,然后再返回。所以就不难理解为什么返回的顺序是 3,5,8 了
对于 SELECT * FROM `players` WHERE age IN (19, 14, 20);
查询条件是 age, 也是带有索引的字段,所以返回数据时,同样会先根据索引排序,最终返回结果为 14,19,20,也就是对应id 5, 3, 8
对于 SELECT * FROM `players` WHERE nickname IN ('Bryant', 'Sherry', 'John');
同样,由于 nickname 字段也带有索引,所以MySQL在查询时,会先根据索引进行排序,这里是字符串,则会根据字母表顺序排序,即 ‘Bryant’, ‘John’, ‘Sherry’,也就是对应返回结果为 8, 3, 5
最后一个例子,SELECT * FROM `players` WHERE vocation IN ('gardener', 'athlete', 'artist');
对于这个语句来说,查询条件字段 vocation 不带索引,所以MySQL查询时不会根据该字段进行排序,但是由于语句没有用 ORDER BY 显示指明排序字段,所以MySQL会默认根据主键字段对检索结果进行排序,所以得到了 3, 5, 8 的查询结果也就不令人意外了
所以,我们可以得到一个结论,当MySQL 在执行没有用ORDER BY 显示指明排序字段的WHERE IN 语句时,会先判断查询字段是否带有索引,如果带有索引的话,会根据该字段进行排序返回最后的查询结果,反之则会根据主键顺序返回最后查询结果