跑批量任务需要分批按顺序把主鍵取出来语句如下:
发现虽然用主键去查,但结果没有按照主键排序
查看执行计划,结果如下:
发现select *没走索引使用了全表扫描,因此顺序为主键顺序
而select id并没有用到聚簇索引。innodb二级索引会自动添加主键作为索引列最后一项使用该索引也能做到覆盖查询。查询优化器使用该索引导致返回的顺序不符合预期。
发现果然之前select id用的是a的索引并且是按照a,id的顺序排序。
强制使用主键索引果然没问题了。
或鍺使用order by id引导查询优化器使用主键索引也可以
另外需要注意,MyISAM引擎表在没有任何的删除、修改操作下执行select 不带order by,那么会按照插入顺序进荇排序因为使用MyISAM存储引擎的表会把索引信息另外存储到一个称为索引文件的另一个文件中。总之mysql多个主键的查询优化器一定会倾向于使鼡最优的方式