order by 索引是否一定会走索引

order by 后面跟主键是否会走索引和优化问题

1.select * from test order by id limit m, n;
  m越大,查询性能会越低
2.select * from table where id > (select id from table limit m, 1)
  通过子查询的方式,在不知道上一页id的情况下优化
3.如果order by的字段有多个值,那么对这这些相同值返回的顺序是不确定的(会出现相同数据),
  需要在排序的字段中加一个唯一的字段
  select * from test order by name,id limit m, n;
4.ordey by与filesort
  在用不上索引进行排序的条件下,会利用filesort进行辅助排序。
  如果用到了filesort,就一定会有额外的IO开销和内存开销。
  filesort目前有两种排序算法,双路排序和单路排序。
  单路排序相比于双路排序,会一次性将数据查出,IO开销理论上比双路小。
  单路排序一次性将数据全部查询到内存中,内存开销比双路排序大。
  但是,有一种说法是当单路排序需要的内存不够时,
  单路排序也需要多次取数据,可能实际上IO的开销会比双路排序大。
5.ordey by走索引
  (1).如果select只查询索引字段,orderby索引字段会用到索引,要不然就是全表扫描
  (2).如果有where条件,比如where password_id=1 order by password_id asc . 这样order by 也会用到索引!
  (3).order by跟limit,那么就请在没有where查询的时候order by id(主键), 有where 查询的时候,order by (索引) 字段
     EXPLAIN SELECT * FROM eureka_account a WHERE a.eureka_name='LOL英雄联盟账号' order  by a.password_id LIMIT 1,2 --(索引)
     EXPLAIN SELECT * FROM eureka_account a order  by a.id LIMIT 1,2 --(主键)
  (4).where 字段和order by字段建立联合索引,索引顺序为(lastest_status, update_time)和where, order by字段的顺序一致,
     且 select 的字段仅为索引中的字段。
6.ordey by不走索引
  (1).order by多个字段,其中任何一个字段没有索引,都会出现filesort。
  (2).order by多个字段,这几个字段必须建立联合索引,且出现在order by后的顺序必须满足最佳左前缀规则,否则会出现filesort。

总结:

1.对于连续单调的字段用limit时,可以采用子查询的方式来提升在大数据量下的分页性能
    2.对于不连续单调的字段用limit时,可以采用正序查询和倒序查询,或者做连续单调映射表的方式来提升大数据量下的分页性能
    3.当order by和limit混合使用时,可能会出现排序结果和预期不一致,这个时候需要按照官方文档的说明,在order by的字段中加上一个唯一字段。
    4.order by的字段无索引,必出现filesort
    5.order by的字段有索引且走索引覆盖才不会出现filesort
    6.where 和 order by一起使用时,where的字段和order by的字段都建立了索引,且不是联合索引,会导致order by的索引失效,出现filesort
    7.where 和 order by一起使用时,where的字段和order by的字段应该建立了索引,且索引顺序和where 和 order by的顺序一致,且select的字段不包含不在索引中的字段,这样的性能是最优的

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值