[MySQL] 索引与性能(4)- 排序

我们知道B树索引是有序的,那么可不可以通过只扫描索引就能完成order by操作呢?答案是肯定的,但条件也比较苛刻:只有当索引的列顺序和order by字句的列顺序完全一致,且order by字句中所有列的排序方式要么全部都是ASC,要么全部都是DESC,MySQL才能使用索引来对结果进行排序;如果查询需要关联多个表,则条件更苛刻,只有当order by字句中的列全部为驱动表(执行计划中)时,才能使用索引做排序。

下面我们来看一些例子:假设users表上有索引(login_id,status)

root@test 05:03:12>explain select id from users order by login_id,status\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: users
         type: index
possible_keys: NULL
          key: login_id
      key_len: 387
          ref: NULL
         rows: 5894108
        Extra: Using index
1 row in set (0.00 sec)

root@test 05:03:17>explain select id from users order by status\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: users
         type: index
possible_keys: NULL
          key: login_id
      key_len: 387
          ref: NULL
         rows: 5894108
        Extra: Using index; Using filesort
1 row in set (0.00 sec)

root@test 05:03:26>explain select id from users order by login_id desc,status\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: users
         type: index
possible_keys: NULL
          key: login_id
      key_len: 387
          ref: NULL
         rows: 5894108
        Extra: Using index; Using filesort
1 row in set (0.00 sec)

root@test 05:04:03>explain select id from users order by login_id desc,status desc\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: users
         type: index
possible_keys: NULL
          key: login_id
      key_len: 387
          ref: NULL
         rows: 5894108
        Extra: Using index
1 row in set (0.00 sec)
注:如果在Extra列出现using filesort,表示无法按索引顺序扫描。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值