mysql优化-order by

一、order by 执行流程

  • select a,b,c from t where a = xxx order by b limit 100

假设a上有索引、b上没有索引(全字段排序)

执行过程:

  • 通过a的索引树,获取到a=xxx的id
  • 通过id从聚簇索引中查询到a,b,c三个字段,放入内存sort_buffer中
  • 在sort_buffer中根据b排序(如果sort_buffer不够大,则采用外部排序)
  • 返回前100条

rowid排序

如果要查询的一行数据过多,那么sort_buffer能放下的数据条数就很少,就容易触发外部排序,效率很低。mysql有个参数来控制sort_buffer单行长度max_length_for_sort_data,当单行超过max_length_for_sort_data时,mysql会采用rowid排序

执行过程:

  • 通过a的索引树,获取到a=xxx的id
  • 通过id获取到b
  • 将b,id写入sort_buffer
  • 按b排序
  • 取前100条,用id回表查出a,b,c返回

二、优化

排序是个很费时的操作,如果b本身有序,就不用再排了,自然而然想到索引,索引本身就是有序的,所以可以建一个联合索引(a,b)

执行步骤:

  • 通过(a,b)索引树查找到a=xxx的id
  • 通过id获取a,b,c返回
  • 顺序获取下一个id

重复步骤

如果查询的字段少,还可以使用覆盖索引,表都不用回了

posted @ 2022-03-14 22:04  hugeQAQ  阅读(71)  评论(0编辑  收藏  举报