为什么MySQL中的'select *'和'select id'之间的id不同?

时间:2017-08-17 09:09:50

标签: mysql jdbc

我有一个名为account_info的表。 当我运行select id from account_info limit 0, 10时,结果如下。

ids

但是当我运行select * from acccount_info limit 0, 10时,结果如下(忽略其他列)。

ids

为什么ID不同? 当我向这两个sql添加order by id时,结果是相同的。似乎结果的顺序很重要。但我认为当没有order by id时,select id from account_info limit 0, 10select * from account_info共享相同的默认排序策略,结果应该相同。

有人可以解释原因吗?我的MySQL版本是5.7.14。

1 个答案:

答案 0 :(得分:3)

没有"默认排序政策"因为排序总是需要一些(通常非常昂贵的)计算,所以如果你没有指定任何顺序,MySQL可以按照它认为最快/最便宜的方式自由地返回行。

当您仅查询id时,您看到要排序的值的原因是,在这种情况下,MySQL只需要读取存储为(已排序)B树的主键。您可以通过查看查询执行计划来确认这一点 - 它应显示Using index,其描述为:

  

仅使用表格检索列信息   索引树中的信息,无需进行额外的搜索   阅读实际的行。查询使用时可以使用此策略   只有属于单个索引的列。

当您查询*时,MySQL必须遍历表格数据本身,可以按任何顺序存储。

请注意,上述说明并不保证结果排序。要重复:没有明确的ORDER BY所有投注均不会返回数据。